Versio

Recepten per categorie tellen

Overzicht Reageren

GaMer B

GaMer B

05/04/2008 20:02:00
Quote Anchor link
Hallo allemaal,

Momenteel haal ik alle categorieën op door middel van deze query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT id, categorieNaam FROM categorie


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
 
PHP hulp

PHP hulp

25/05/2012 14:12:03
Gesponsorde koppelingen:
BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  
 
Martijn B

Martijn B

05/04/2008 20:21:00
Quote Anchor link
Dat kun je op verschillende manieren doen.

Je zou dit kunnen doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
SELECT
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
 
Frank -

Frank -

05/04/2008 20:23:00
Quote Anchor link
Even uit de losse pols:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SET SESSION sql_mode =  'ANSI,ONLY_FULL_GROUP_BY';

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 -
 
GaMer B

GaMer B

05/04/2008 20:44:00
Quote Anchor link
@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.
 
Frank -

Frank -

05/04/2008 20:50:00
Quote Anchor link
Kleine aanpassing:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

Zie het omdraaien van de JOIN en dat het nu een LEFT JOIN is geworden. Hij moet ook tellen als er geen resultaten zijn.
 
GaMer B

GaMer B

05/04/2008 20:53:00
Quote Anchor link
Geweldig! Het werkt :) Dankjewel. (had er zelf ook op moeten komen -_-' betreffende die LEFT JOIN) Maarja, dankjewel.
 
GaMer B

GaMer B

06/04/2008 11:56:00
Quote Anchor link
Sorry voor de bump, maar toch nog even een vraag:

Ik gebruik dus deze query van pgFrank:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

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)?
 
Bo az

Bo az

06/04/2008 12:08:00
Quote Anchor link
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
 
GaMer B

GaMer B

06/04/2008 12:20:00
Quote Anchor link
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.
 



Overzicht Reageren

Get Adobe Flash player