gegevens groeperen in SELECT query
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
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.
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
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
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'.
Bedankt voor je reactie, ik ga hier binnenkort eens even naar kijken !
Groeten,
Arie