Bạn cần sử dụng GROUP BY
để giải thích các nhóm cần đếm dựa trên. Không có GROUP BY
bạn chỉ nhận được một nhóm duy nhất của toàn bộ tập hợp kết quả, như bạn đã thấy.
Trong SQL chuẩn, cần phải đưa vào GROUP BY
mệnh đề mọi biểu thức không tổng hợp được bao gồm trong SELECT
, nhưng MySQL cho phép bạn không làm điều này, cho phép một biểu thức như sau. (Ít nhất, khi không ở chế độ nghiêm ngặt; tôi không chắc liệu chế độ nghiêm ngặt có tăng cường yêu cầu này để phù hợp với SQL chuẩn hay không)
SELECT `items`.*, COUNT(1) AS points
FROM `items` INNER JOIN `points` ON `items`.`id` = `points`.`item_id`
WHERE ...
GROUP BY `items`.`id`
Giả sử rằng items.id
là khóa chính của bảng này và vì vậy nó sẽ không xuất hiện trong nhiều hàng items
, điều này sẽ có hiệu quả mong muốn.
Sau khi bạn giới thiệu GROUP BY
điều quan trọng là phải hiểu sự khác biệt giữa WHERE
và HAVING
điều khoản. Trước đây áp dụng điều kiện trước đó nhóm và tổng hợp được áp dụng, trong khi cái sau áp dụng sau đó . Điều này có nghĩa là bạn phải sử dụng HAVING
nếu bạn muốn thực hiện một điều kiện dựa trên số lượng đó; WHERE
mệnh đề trong ví dụ ban đầu của bạn sẽ áp dụng trước tổng hợp, vì vậy kết quả sẽ là số điểm được tạo sau ngày nhất định.