Ik ben zelf een forum aan het schrijven en ik loop nu al tegen het eerste probleem, ik wil in een query alle categorieën selecteren en ook het aantal topics in die categorie.
Dit is de query die ik nu gebruik:
<?php
$sFora = " SELECT
c.c_id,
c.naam,
COUNT(t.t_id) AS aantaltopics
FROM
cats AS c,
topics AS t
WHERE
t.t_id = c.c_id
;";
?>
De foutmelding die ik krijg:
Error!
Fout: SQL-fout
Query: SELECT c.c_id, c.naam, COUNT(t.t_id) AS aantaltopics FROM cats AS c, topics AS t WHERE t.t_id = c.c_id ;
Errornummer: 1140
Foutmelding: Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
Ik begrijp hieruit dat ik iets met het GROUP BY element moet doen, maar daar begrijp ik niet heel erg veel van, ik heb hier een tutorial over GROUP BY gelezen maar ik snap het nog steeds niet echt.
[quote='Klaasjan Boven schreef op 22.01.2007 18:43']
Grouperen op alles wat je opvraagt
Kan je uitleggen waarom? 1 id heeft ook maar 1 naam, dus dat is in dit geval niet nodig, alleen het Id moet voldoende zijn.[/quote]
Ik ga dat nog eens goed uitzoeken Robert volgens mij hebben we deze discussie al eens eerder gehad.
Ik werk ( op mijn werk) wel eens met SQL+ en Oracle en ik weet zeker dat je daarmee moet groeperen op alles wat in de SELECT staat behalve datgene wat je met de agregate?? functie, in dit geval COUNT() opvraagd
[edit] wat zeggen de sql gurus alhier ervan. Ik verwacht minstens een recatie van Jan, Frank, Blanche, Willem vp en ik vergeet er vast nog wel een paar[/edit]
[edit]2 Ik zie nu nt dat Boaz btw ook zegt dat je moet groeperen op alles wat niet in de COUNT() voorkomt. Volgens mij gaat mysql er alleen niet goed mee om[/edit]
@Klaasjan: je hebt voor het grootste gedeelte gelijk. Het klopt dat je in de GROUP BY clause normaal gesproken alle kolommen moet noemen die in je SELECT voor komen en niet een onderdeel zijn van een aggregate functie.
Echter MySQL maakt hier een uitzondering op. Je kunt met MySQL wel 'non-aggregated' kolommen opnemen die je niet in je GROUP BY clause hebt staan. Zie ook deze paragraaf uit de mysql handleiding.
ps. Wees er echter wel zeker van dat deze kolommen daadwerkelijk overbodige (redundante) informatie bevatten. Een voorbeeld is als een id maar gekoppeld kan zijn aan 1 naam en deze naam ook alleen maar gekoppeld kan zijn aan dat ene id. Dat is namelijk de enige mogelijkheid waarin je zeker weet dat de juiste naam ook bij het juiste id vermeld wordt.
even weer terug naar mijn probleem, wat ik nog weet van GROUP BY is dat het samen gaat met HAVING en dat HAVING ongeveer gelijk is aan WHERE heeft het er misschien iets mee te maken dat in mijn huidige niet werkende query WHERE i.p.v having voorkomt?