Hallo beste mensen,

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.

Heeft iemand voor mij een werkende oplossing

Groetjes

Freek
De kolommen die niet in een functie als COUNT, MAX, MIN, AVG of ... voor komen, moeten in het GROUP BY gedeelte van de query voorkomen.
@Boaz(of iemand anders): Hoe werkt een GROUP BY? Ik snap er namelijk bijna niets van, en zeker niet als je ook nog twee tabellen gebruikt.
<?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
GROUP BY
t.t_id
;";
?>

En waarom, omdat je nu 2 tabellen vergelijkt moet je aangeven op welke kolom het tellen moet worden gegroepeerd.
<?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
GROUP BY
c.c_id,
c.naam
;";

?>

Grouperen op alles wat je opvraagt
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.
Helaas beide oplossingen geven geen resultaat maar de query gaat zonder fouten, en ik weet zeker dat de tabel namen kloppen.

Ik krijg een resultaat van 0 dus er wordt niets gevonden.
Geen foutmelding of waarschuwing omdat de query niet fout is.
Robert schreef op 22.01.2007 18:56
[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?

Reageren