gegevens groeperen in SELECT query

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Arie Kant

Arie Kant

04/01/2013 16:14:32
Quote Anchor link
Hallo,

Ik heb een tabel met daarin o.a. de volgende gegevens:

datum soort
2013-01-04 kat
2013-01-04 hond
2013-01-04 hond
2013-01-04 vogel
2013-01-04 hond
2013-01-03 hond
2013-01-03 hond
2013-01-03 kat
2013-01-03 vogel
2013-01-03 kat
2013-01-03 kat
2013-01-03 vogel

Nu wil ik een query maken welke ik in een loop kan gebruiken zodat het resultaat zou zijn van de afgelopen week. Ik wil deze per datum alle soorten groeperen en daarvan de aantallen weten. Alle soorten hoeven niet per definitie elke dag voor te komen. :

// array kat
$data_kat=array("2013-01-04" => 1, "2013-01-03" => 3);

// array hond
$data_hond=array("2013-01-04" => 3, "2013-01-03" => 2);

// array vogel
$data_vogel=array("2013-01-04" => 1, "2013-01-03" => 2);

Ik heb nu onderstaande query :

$sql = "SELECT datum, soort, COUNT(soort) AS aantal FROM tabel WHERE datum >= (CURDATE() - INTERVAL 1 WEEK) GROUP BY datum, soort ORDER BY datum, soort";

$result = mysql_query($sql) or die('Query failed: ' . mysql_error());
if ($result) {
while ($row = mysql_fetch_assoc($result)) {
$datum = $row["datum"];
$aantal = $row["aantal"];
$data[$datum] = $aantal;
}
}

Maar ik krijg als output het volgende :

$data=array("2013-01-04" => 1, "2013-01-03" => 3);

Dus voor alleen de soort kat krijg ik alle records in een array.

Hoe krijg ik ook voor de andere soorten deze in een array? Moet ik daarvoor meerdere query's maken of kan dat ik in 1 query?

Met vriendelijke groeten,

Arie
Gewijzigd op 04/01/2013 16:16:51 door Arie Kant
 
PHP hulp

PHP hulp

22/12/2024 15:10:08
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

04/01/2013 17:20:55
Quote Anchor link
Je query is goed, alleen behandel je het resultaat verkeerd.
Met de gegevens die je hebt zou je dit moeten krijgen uit de query (datum, soort, aantal)
2013-01-03, hond, 2
2013-01-03, kat, 3
enz.
Afhankelijk van hoe je het wilt presenteren is het vaak niet nodig om dit in php om te zetten naar een array.
 
Arie Kant

Arie Kant

07/01/2013 13:40:08
Quote Anchor link
Beste Ger,

Bedankt voor je reactie.

Het is inmiddels met een kleine aanpassing gelukt maar ik loop nog even tegen het volgende aan:

Het gebeurt wel eens dat op een bepaalde dag geen records gevonden worden voor een hond of kat, deze krijgen dan geen record in het resultaat maar eigenlijk wil ik daar dan 0 hebben staan i.p.v. dat de datum voor deze hond of kat wordt overgeslagen.

Is dat mogelijk?

Groeten,

Arie
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

07/01/2013 14:06:17
Quote Anchor link
Alleen omhoog vallen en omlaag stijgen is onmogelijk!
Heb je een tabel voor de diersoorten?

Toevoeging op 07/01/2013 15:17:25:

Trouwens ook niet nodig.
Dit is één van de zeldzame situaties waar een cross join van pas komt:
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
SELECT
    ds.datum, ds.soort, COUNT(sd.soort)
FROM
    (
    SELECT DISTINCT
        d.datum, s.soort
    FROM
        geworpenen d, geworpenen s
    WHERE
        d.datum >= CURDATE() - INTERVAL 1 WEEK
    ) ds
LEFT JOIN
    geworpenen sd
    ON ds.datum = sd.datum AND ds.soort = sd.soort
GROUP BY
    ds.datum, ds.soort
ORDER BY
    ds.datum, ds.soort

De cross join in de subquery plakt elke diersoort die in de tabel voorkomt aan een datum vast, ook al is er op die datum geen hond geboren, wordt de hond toch aan die datum 'gekoppeld'.
 
Arie Kant

Arie Kant

07/01/2013 15:35:29
Quote Anchor link
Hoi Ger,

Bedankt voor je reactie, ik ga hier binnenkort eens even naar kijken !

Groeten,

Arie
 



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.