Komunikat o błędzie informuje:
agregaty niedozwolone w klauzuli WHERE
count()
jest funkcją agregującą. Użyj w tym celu klauzuli HAVING.
Zapytanie może wyglądać tak:
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
W PostgreSQL 9.1 lub nowszym wystarczy GROUP BY
klucz podstawowy tabeli (zakładając, że recommendations.id
jest PK). W wersjach Postgresa przed 9.1 trzeba było uwzględnić wszystkie kolumny SELECT
listy, które nie są agregowane w GROUP BY
lista. Z recommendations.*
w SELECT
lista, która byłaby każdą pojedynczą kolumną tabeli.
Cytuję informacje o wydaniu PostgreSQL 9.1:
Zezwól na inne niż GROUP BY
kolumny na liście celów zapytania, gdy klucz podstawowy jest określony w GROUP BY
klauzula (Peter Eisentraut)
Prostsze z podwyborem
Tak czy inaczej, jest to prostsze i szybsze, robiąc to samo:
SELECT *
FROM recommendations r
WHERE user_id = $current_user_id
AND (SELECT count(*)
FROM approvals
WHERE recommendation_id = r.id) = 1;
Unikaj mnożenia wierszy za pomocą JOIN
a priori, nie musisz ich ponownie agregować.