Recepten per categorie tellen
Hallo allemaal,
Momenteel haal ik alle categorieën op door middel van deze query:
Nu wil ik echter ook achter elke categorie een getal hebben staan en dat getal representeert het aantal recepten die als categorieID het id van die categorie, dus simpelweg deze structuur:
table recepten:
id
titel
categorieID
table categorie
id
categorieNaam.
Is dit mogelijk in één query of moet ik een omweg gebruiken?
Mvg,
GaMer13
Momenteel haal ik alle categorieën op door middel van deze query:
Nu wil ik echter ook achter elke categorie een getal hebben staan en dat getal representeert het aantal recepten die als categorieID het id van die categorie, dus simpelweg deze structuur:
table recepten:
id
titel
categorieID
table categorie
id
categorieNaam.
Is dit mogelijk in één query of moet ik een omweg gebruiken?
Mvg,
GaMer13
Gesponsorde koppelingen:
Dat kun je op verschillende manieren doen.
Je zou dit kunnen doen:
Je zou ook een extra kolom in categorieen kunnen maken. Waarin het aantal staat.
Je zou dit kunnen doen:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT
id, categorieNaam, COUNT(recepten.id) AS aantal
FROM
categorie
LEFT JOIN
recepten ON (categorie.id = recepten.categorieID)
id, categorieNaam, COUNT(recepten.id) AS aantal
FROM
categorie
LEFT JOIN
recepten ON (categorie.id = recepten.categorieID)
Je zou ook een extra kolom in categorieen kunnen maken. Waarin het aantal staat.
Gewijzigd op 01/01/1970 01:00:00 door Martijn B
Even uit de losse pols:
Niet getest, dat mag je zelf even doen.
Mocht je MySQL gebruiken, wel even goed configureren en dus dat foute GROUP BY's worden afgekeurd, dus met ONLY_FULL_GROUP_BY (zie de handleiding)
Edit: Even getest, werkt uitstekend!
Wel eerst deze query uitvoeren in MySQL:
En dán pas de rest. Foute queries worden dan afgekeurd.
Edit2: @Martijn: Jouw query levert een fraaie error op, je gebruikt geen GROUP BY terwijl dat wel verplicht is.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
SELECT
cat.id,
cat.categorieNaam,
COUNT(r.id) AS aantal
FROM
recepten AS r
INNER JOIN categorie AS cat ON cat.id = r.categorieID
GROUP BY
cat.id,
cat.categorieNaam
cat.id,
cat.categorieNaam,
COUNT(r.id) AS aantal
FROM
recepten AS r
INNER JOIN categorie AS cat ON cat.id = r.categorieID
GROUP BY
cat.id,
cat.categorieNaam
Niet getest, dat mag je zelf even doen.
Mocht je MySQL gebruiken, wel even goed configureren en dus dat foute GROUP BY's worden afgekeurd, dus met ONLY_FULL_GROUP_BY (zie de handleiding)
Edit: Even getest, werkt uitstekend!
Wel eerst deze query uitvoeren in MySQL:
En dán pas de rest. Foute queries worden dan afgekeurd.
Edit2: @Martijn: Jouw query levert een fraaie error op, je gebruikt geen GROUP BY terwijl dat wel verplicht is.
Gewijzigd op 01/01/1970 01:00:00 door Frank -
@pgFrank, ik heb jouw query getest en werkt perfect alleen de categorieën waarvan nog geen recepten zijn geplaatst (waarvan de 'aantal' dus 0 is) worden niet getoond in de lijst.
Kleine aanpassing:
Zie het omdraaien van de JOIN en dat het nu een LEFT JOIN is geworden. Hij moet ook tellen als er geen resultaten zijn.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
SET SESSION sql_mode = 'ANSI,ONLY_FULL_GROUP_BY';
SELECT
cat.id,
cat.categorieNaam,
COUNT(r.id) AS aantal
FROM
categorie AS cat
LEFT JOIN recepten AS r ON cat.id = r.categorieID
GROUP BY
cat.id,
cat.categorieNaam
SELECT
cat.id,
cat.categorieNaam,
COUNT(r.id) AS aantal
FROM
categorie AS cat
LEFT JOIN recepten AS r ON cat.id = r.categorieID
GROUP BY
cat.id,
cat.categorieNaam
Zie het omdraaien van de JOIN en dat het nu een LEFT JOIN is geworden. Hij moet ook tellen als er geen resultaten zijn.
Geweldig! Het werkt :) Dankjewel. (had er zelf ook op moeten komen -_-' betreffende die LEFT JOIN) Maarja, dankjewel.
Sorry voor de bump, maar toch nog even een vraag:
Ik gebruik dus deze query van pgFrank:
Maar ik heb nog een criterium, namelijk of het recept goedgekeurd is door de administrator (0 is niet goedgekeurd, 1 is goedgekeurd). Als ik er een WHERE r.goedgekeurd = 1 in de query in zet, dan krijg ik totaal geen lijst meer te zien. Is dit te omzeilen, zodat er dan gewoon in plaats van:
Ontbijt (1)
Andere (0)
Categorieën (0)
dit komt te staan:
Ontbijt (0)
Andere (0)
Categorieën (0)?
Ik gebruik dus deze query van pgFrank:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
SELECT
cat.id,
cat.categorieNaam,
COUNT(r.id) AS aantal
FROM
categorie AS cat
LEFT JOIN recepten AS r ON cat.id = r.categorieID
GROUP BY
cat.id,
cat.categorieNaam
cat.id,
cat.categorieNaam,
COUNT(r.id) AS aantal
FROM
categorie AS cat
LEFT JOIN recepten AS r ON cat.id = r.categorieID
GROUP BY
cat.id,
cat.categorieNaam
Maar ik heb nog een criterium, namelijk of het recept goedgekeurd is door de administrator (0 is niet goedgekeurd, 1 is goedgekeurd). Als ik er een WHERE r.goedgekeurd = 1 in de query in zet, dan krijg ik totaal geen lijst meer te zien. Is dit te omzeilen, zodat er dan gewoon in plaats van:
Ontbijt (1)
Andere (0)
Categorieën (0)
dit komt te staan:
Ontbijt (0)
Andere (0)
Categorieën (0)?
Ik denk dat je 'AND r.goedgekeurd = 1' aan je join voorwaarde moet toevoegen. In de where gaat niet werken omdat je groepeert.
Gewijzigd op 01/01/1970 01:00:00 door Bo az
Boaz schreef op 06.04.2008 12:08:
Ik denk dat je 'AND r.goedgekeurd = 1' aan je join voorwaarde moet toevoegen. In de where gaat niet werken omdat je groepeert.
Top (Y) Het werkt.



