Vous devez utiliser GROUP BY
pour expliquer sur quels regroupements compter. Sans GROUP BY
vous n'obtenez qu'un seul groupe de l'ensemble des résultats, comme vous l'avez vu.
En SQL standard il faut inclure dans le GROUP BY
clause chaque expression non agrégée incluse dans le SELECT
clause, mais MySQL vous permet de ne pas le faire, en autorisant une expression comme celle-ci. (Du moins, lorsqu'il n'est pas en mode strict ; je ne sais pas si le mode strict renforce cette exigence pour correspondre au SQL standard)
SELECT `items`.*, COUNT(1) AS points
FROM `items` INNER JOIN `points` ON `items`.`id` = `points`.`item_id`
WHERE ...
GROUP BY `items`.`id`
En supposant que items.id
est la clé primaire de cette table, et donc elle n'apparaîtra pas dans plus d'une ligne de items
, cela devrait avoir l'effet désiré.
Une fois que vous avez introduit GROUP BY
il est important de comprendre la différence entre le WHERE
et HAVING
clauses. Le premier applique la condition avant le groupe et les agrégats sont appliqués, tandis que ces derniers s'appliquent après . Cela signifie que vous devez utiliser HAVING
si vous voulez faire une condition basée sur ce nombre ; le WHERE
La clause dans votre exemple initial s'appliquera avant l'agrégat, donc le résultat sera le nombre de points créés après la date donnée.