Woord laten tellen in database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Lasse

Lasse

20/12/2007 19:43:00
Quote Anchor link
Beste forumleden,

Ik ben nog een beginner op MySQL gebied maar vroeg mij af hoe ik een bepaald woord uit een bepaalde kolom kan laten tellen.
Dus als ik heb:
Id - Achternaam
1 - Jansen
2 - Zomer
3 - Jansen

Dat ik dan automatisch in php kan laten weergegeven, de achternaam Jansen is '2' keer voorgekomen.

Alvast bedankt!

Lasse
 
PHP hulp

PHP hulp

22/12/2024 18:08:10
 
Joren de Wit

Joren de Wit

20/12/2007 19:49:00
Quote Anchor link
Uiteraard!
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
SELECT
    Achternaam,
    COUNT(Achternaam) AS aantal
FROM
    tabel
GROUP BY
    Achternaam

Dit is de query die je wilt gebruiken...
 
Martijn B

Martijn B

20/12/2007 19:53:00
Quote Anchor link
Er moet dan ook een index op Achternaam toch?

Tenminste als er heel wat records in komen.
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
 
Joren de Wit

Joren de Wit

20/12/2007 19:58:00
Quote Anchor link
Jep, in een tabel met veel records zal dat met deze query zeker een snelheidswinst opleveren.
 
Lasse

Lasse

20/12/2007 20:16:00
Quote Anchor link
Het wordt een tabel met ongeveer 400 rijen en 10 kolommen. Is het dan zinvol om de index toe te passen? En hoe pas ik deze index dan toe? Een link naar een tutorial/script is ok goed.
 
Joren de Wit

Joren de Wit

20/12/2007 20:25:00
 
Lasse

Lasse

24/12/2007 17:28:00
Quote Anchor link
Ok bedankt!
 
Frank -

Frank -

24/12/2007 17:32:00
Quote Anchor link
Lasse schreef op 20.12.2007 20:16:
Het wordt een tabel met ongeveer 400 rijen en 10 kolommen. Is het dan zinvol om de index toe te passen? En hoe pas ik deze index dan toe? Een link naar een tutorial/script is ok goed.
400? Dat is dan 400 x niks. Pas bij een paar miljoen records begint het echt wat te worden, bij 400 miljoen kun je spreken van 'groot'. Wanneer jij voor de id's een INT gebruikt, kun je zo'n 4 miljard records aanmaken, bij een BIGINT nog véél meer.

Mensen denken klein, databases werken in het groot.
 
Klaasjan Boven

Klaasjan Boven

24/12/2007 17:34:00
Quote Anchor link
@Frank TS zegt ook niet dat het groot wordt :)
 
Frank -

Frank -

24/12/2007 17:39:00
Quote Anchor link
Klaasjan Boven schreef op 24.12.2007 17:34:
@Frank TS zegt ook niet dat het groot wordt :)
Dat weet ik, maar ik wilde hem even duidelijk maken dat 400 records onvoorstelbaar weinig is voor een database.

Tenminste, wanneer je geen terrabytes aan data in 1 enkel record op gaat slaan. In PostgreSQL geldt een maximum van 32TB per tabel en 1.6TB per record. MySQL kan minder data kwijt, maar nog altijd achtelijk veel.
 
Lasse

Lasse

24/12/2007 18:32:00
Quote Anchor link
pgFrank schreef op 24.12.2007 17:39:
Dat weet ik, maar ik wilde hem even duidelijk maken dat 400 records onvoorstelbaar weinig is voor een database.


Bedankt ;) k heb dan ook geen gebruikt van de indexen maar van onderstaant script:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
mysql_connect("localhost", "username", "password");
mysql_select_db("database") or die( "Unable to select database");

$query = "SELECT achternaam, COUNT(achternaam) AS aantal FROM tabel WHERE achternaam = 'Jansen' GROUP BY achternaam";
  $resultaat = mysql_query($query);
  while ($rij = mysql_fetch_array($resultaat)) {
  $achternaam = $rij["achternaam"];
  $totaal = $rij["aantal.achternaam"];

$totaal = $rij['aantal'];

  echo"De achternaam $achternaam is $totaal keer voorgekomen.<br>\n";
  }

?>

Dit script werkt maar nu ontstaat er een probleem. Als er in het veld Achternaam bijvoorbeeld 'Jansen Minkes' is ingevuld telt het script deze waarde niet. Alleen als er alleen maar 'Jansen' is ingevuld en niet meer. Hoe kan ik er voor zorgen dat deze toch ook geteld wordt?
Gewijzigd op 01/01/1970 01:00:00 door Lasse
 
Jan Koehoorn

Jan Koehoorn

24/12/2007 18:37:00
Quote Anchor link
Misschien heb ik het niet goed gelezen, maar de TS wil volgens mij weten hoevaak een bepaalde string in een bepaald veld in de tabel voorkomt.

Met COUNT(achternaam) haal je gewoon het aantal velden op.

Ik zou zo snel niet weten of er een MySQL equivalent is voor de PHP substr_count functie. Het lijkt er dus op dat je gewoon de inhoud van het veld 'achternaam' voor de hele tabel moet fetchen en dan met PHP substrings gaan zitten tellen.
Edit:
Net even getest, en dit werkt in ieder geval:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
    require 'classes/class.core.php';
    require 'classes/class.database.php';
    
    $db = new database ();
    
    $sql = "
        SELECT naam
        FROM ckv_instellingen
        "
;
    $n = 0;
    $search = 'de';
    if ($res = $db->query ($sql)) {
        while ($row = $db->fetch ()) {
            $n += substr_count ($row['naam'], $search);
        }

        echo '<p>' . $search . ' is ' . $n . ' keer gevonden.</p>';
    }


?>
Gewijzigd op 01/01/1970 01:00:00 door Jan Koehoorn
 
Joren de Wit

Joren de Wit

24/12/2007 18:46:00
Quote Anchor link
Zoals ik het las ging het om de volledige waarden in de kolom Achternaam en het aantal keer dat deze verschillende waarden in totaal voorkomen. In dat geval gebruik je dus GROUP BY om te groeperen op die waarden...
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Lasse

Lasse

24/12/2007 19:16:00
Quote Anchor link
Bedankt voor het script ik zit er nu mee te knutselen.
Lasse schreef op 24.12.2007 18:32:
k heb dan ook geen gebruikt van de indexen maar van onderstaant script:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
mysql_connect("localhost", "username", "password");
mysql_select_db("database") or die( "Unable to select database");

$query = "SELECT achternaam, COUNT(achternaam) AS aantal FROM tabel WHERE achternaam = 'Jansen' GROUP BY achternaam";
  $resultaat = mysql_query($query);
  while ($rij = mysql_fetch_array($resultaat)) {
  $achternaam = $rij["achternaam"];
  $totaal = $rij["aantal.achternaam"];

$totaal = $rij['aantal'];

  echo"De achternaam $achternaam is $totaal keer voorgekomen.<br>\n";
  }

?>

Maar als ik met bovenstaand script een achternaam zoek die (nog) niet voorkomt wordt er niets weergegeven. Hier zou ik dan graag bij $totaal 0 aangeven, iemand idee hoe ik dat realiseer?

Alvast bedankt!
 
Jan Koehoorn

Jan Koehoorn

24/12/2007 19:19:00
Quote Anchor link
Geeft die COUNT niet standaard een 0?

Dan zou je kunnen doen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
    if (empty ($totaal)) $totaal = 0;
?>
 
Joren de Wit

Joren de Wit

24/12/2007 19:22:00
Quote Anchor link
De COUNT hoort gewoon 0 terug te geven inderdaad. Wat is dit verder voor vreemde contructie:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$totaal
= $rij["aantal.achternaam"];
?>

Wat probeer je hiermee te bereiken?
 
Lasse

Lasse

24/12/2007 19:31:00
Quote Anchor link
Geen idee, heb het script niet zelf geschreven. Alleen waarden aangepast naar eigen wensen om zo MySQL beetje bij beetje proberen te ontdekken.
Suggesties voor betere constructies?
 
Joren de Wit

Joren de Wit

24/12/2007 19:42:00
Quote Anchor link
Eerder een suggestie voor netter scripten en het juiste toepassen van foutafhandeling:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
mysql_connect("localhost", "username", "password") or die(mysql_error());
mysql_select_db("database") or die( "Unable to select database");

$query = "
    SELECT achternaam,
    COUNT(achternaam) AS aantal
    FROM tabel
    WHERE achternaam = 'Jansen'
    GROUP BY achternaam
"
;

if(!$res = mysql_query($sql))
{

    trigger_error(mysql_error().'<br />In query: '.$sql);
}
  
else
{
    while ($rij = mysql_fetch_array($res))
    {

        echo '<p>De achternaam '.$row['achternaam'].' komt '.$row['aantal'].' keer voor.</p>';
    }
}

?>
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.