Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verbinden Sie zwei Tabellen mysql, eine zu vielen Beziehung

Sie müssen GROUP BY verwenden um zu erklären, auf welcher Gruppierung basierend zu zählen ist. Ohne GROUP BY Sie erhalten nur eine einzelne Gruppe der gesamten Ergebnismenge, wie Sie gesehen haben.

In Standard-SQL muss GROUP BY eingefügt werden Klausel jeden nicht aggregierten Ausdruck, der in SELECT enthalten ist -Klausel, aber MySQL lässt Sie davonkommen, dies nicht zu tun, indem es einen Ausdruck wie den folgenden zulässt. (Zumindest, wenn nicht im strikten Modus; ich bin mir nicht sicher, ob der strenge Modus diese Anforderung verstärkt, um mit Standard-SQL übereinzustimmen)

SELECT `items`.*, COUNT(1) AS points
FROM `items` INNER JOIN `points` ON `items`.`id` = `points`.`item_id`
WHERE ...
GROUP BY `items`.`id`

Angenommen, dass items.id ist der Primärschlüssel dieser Tabelle und erscheint daher nicht in mehr als einer Zeile von items , dies sollte den gewünschten Effekt haben.

Sobald Sie GROUP BY eingeführt haben Es ist wichtig, den Unterschied zwischen WHERE zu verstehen und HAVING Klauseln. Ersteres wendet die Bedingung vorher an die Gruppe und die Aggregate werden angewendet, letzteres gilt danach . Das bedeutet, dass Sie HAVING verwenden müssen wenn Sie eine Bedingung basierend auf dieser Zählung ausführen möchten; das WHERE Klausel in Ihrem ersten Beispiel wird vor dem Aggregat angewendet, sodass das Ergebnis die Anzahl der Punkte ist, die nach dem angegebenen Datum erstellt wurden.