Du måste använda GROUP BY
att förklara vilka grupperingar man ska räkna utifrån. Utan GROUP BY
du får bara en enda grupp av hela resultatuppsättningen, som du såg.
I standard SQL är det nödvändigt att inkludera i GROUP BY
klausul varje icke-aggregerat uttryck som ingår i SELECT
klausul, men MySQL låter dig komma undan med att inte göra detta, vilket tillåter ett uttryck som följande. (Åtminstone när det inte är i strikt läge; jag är inte säker på om strikt läge förstärker detta krav för att matcha standard SQL)
SELECT `items`.*, COUNT(1) AS points
FROM `items` INNER JOIN `points` ON `items`.`id` = `points`.`item_id`
WHERE ...
GROUP BY `items`.`id`
Förutsatt att items.id
är den primära nyckeln i den här tabellen, så den kommer inte att visas i mer än en rad med items
, bör detta ha önskad effekt.
När du introducerar GROUP BY
det är viktigt att förstå skillnaden mellan WHERE
och HAVING
klausuler. Den förra tillämpar villkoret före gruppen och aggregaten tillämpas, medan det senare tillämpas efteråt . Det betyder att du måste använda HAVING
om du vill göra ett villkor baserat på den räkningen; WHERE
klausulen i ditt första exempel kommer att gälla före sammanräkningen, så resultatet blir antalet poäng som skapats efter det givna datumet.