U moet GROUP BY
. gebruiken om uit te leggen op welke groeperingen moet worden gerekend. Zonder GROUP BY
je krijgt gewoon een enkele groep van de hele resultatenset, zoals je hebt gezien.
In standaard SQL is het noodzakelijk om in de GROUP BY
. op te nemen clausule elke niet-geaggregeerde expressie die is opgenomen in de SELECT
clausule, maar MySQL laat je wegkomen door dit niet te doen, waardoor een uitdrukking als de volgende mogelijk is. (Tenminste, wanneer niet in de strikte modus; ik weet niet zeker of de strikte modus deze vereiste versterkt om overeen te komen met standaard SQL)
SELECT `items`.*, COUNT(1) AS points
FROM `items` INNER JOIN `points` ON `items`.`id` = `points`.`item_id`
WHERE ...
GROUP BY `items`.`id`
Ervan uitgaande dat items.id
is de primaire sleutel van deze tabel en zal dus niet in meer dan één rij met items
voorkomen , dit zou het gewenste effect moeten hebben.
Zodra u GROUP BY
. introduceert het is belangrijk om het verschil te begrijpen tussen de WHERE
en HAVING
clausules. De eerste past de voorwaarde voor . toe de groep en de aggregaten worden toegepast, terwijl de laatste achteraf . wordt toegepast . Dit betekent dat je HAVING
. moet gebruiken als je een conditional wilt doen op basis van die telling; de WHERE
clausule in uw eerste voorbeeld is van toepassing vóór het totaal, dus het resultaat is het aantal punten dat na de opgegeven datum is gemaakt.