Mysql
 sql >> Base de données >  >> RDS >> Mysql

Joindre deux tables mysql, relation un à plusieurs

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.