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ć.