Thông báo lỗi cho bạn biết:
tổng hợp không được phép trong mệnh đề WHERE
count()
là một hàm tổng hợp. Sử dụng mệnh đề HAVING cho điều đó.
Truy vấn có thể trông giống như sau:
SELECT r.*
FROM recommendations r
JOIN approvals a ON a.recommendation_id = r.id
WHERE r.user_id = $current_user_id
GROUP BY r.id
HAVING count(a.recommendation_id) = 1
Với PostgreSQL 9.1 trở lên là đủ để GROUP BY
khóa chính của một bảng (giả sử là recommendations.id
là PK). Trong các phiên bản Postgres trước 9.1, bạn phải bao gồm tất cả các cột của SELECT
danh sách không được tổng hợp trong GROUP BY
danh sách. Với các đề xuất recommendations.*
trong SELECT
, đó sẽ là mọi cột của bảng.
Tôi trích dẫn các ghi chú phát hành của PostgreSQL 9.1:
Cho phép không phải
GROUP BY
trong danh sách đích truy vấn khi khóa chính được chỉ định trongGROUP BY
mệnh đề (Peter Eisentraut)
Đơn giản hơn với một lựa chọn phụ
Dù bằng cách nào, điều này cũng đơn giản hơn và nhanh hơn, thực hiện tương tự:
SELECT *
FROM recommendations r
WHERE user_id = $current_user_id
AND (SELECT count(*)
FROM approvals
WHERE recommendation_id = r.id) = 1;
Tránh nhân các hàng với một JOIN
tiên nghiệm, sau đó bạn không phải tổng hợp chúng lại.