Felmeddelandet talar om för dig:
aggregat är inte tillåtna i WHERE-satsen
count() är en aggregerad funktion. Använd HAVING-satsen för det.
Frågan kan se ut så här:
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
Med PostgreSQL 9.1 eller senare räcker det med att GROUP BY den primära nyckeln av en tabell (förutsatt recommendations.id är PK). I Postgres-versioner före 9.1 var du tvungen att inkludera alla kolumner i SELECT lista som inte är samlade i GROUP BY lista. Med recommendations.* i SELECT listan, det skulle vara varje kolumn i tabellen.
Jag citerar releasenoteserna för PostgreSQL 9.1:
Tillåt icke-
GROUP BYkolumner i frågemållistan när primärnyckeln anges iGROUP BYklausul (Peter Eisentraut)
Enklare med ett underval
Hur som helst, det här är enklare och snabbare, gör detsamma:
SELECT *
FROM recommendations r
WHERE user_id = $current_user_id
AND (SELECT count(*)
FROM approvals
WHERE recommendation_id = r.id) = 1;
Undvik att multiplicera rader med en JOIN a priori, då behöver du inte samla tillbaka dem.