Die Fehlermeldung sagt Ihnen:
Aggregate in WHERE-Klausel nicht erlaubt
count() ist eine Aggregatfunktion. Verwenden Sie dafür die HAVING-Klausel.
Die Abfrage könnte so aussehen:
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
Mit PostgreSQL 9.1 oder höher reicht es aus, GROUP BY zu verwenden der Primärschlüssel einer Tabelle (vorausgesetzt recommendations.id ist die PK). In Postgres-Versionen vor 9.1 mussten Sie all einschließen Spalten des SELECT Liste, die nicht in GROUP BY aggregiert sind aufführen. Mit recommendations.* im SELECT Liste, das wäre jede einzelne Spalte der Tabelle.
Ich zitiere die Versionshinweise von PostgreSQL 9.1:
Nicht-GROUP BY zulassen Spalten in der Abfragezielliste, wenn der Primärschlüssel in GROUP BY angegeben ist Klausel (Peter Eisentraut)
Einfacher mit einer Unterauswahl
In beiden Fällen ist dies einfacher und schneller, wenn Sie dasselbe tun:
SELECT *
FROM recommendations r
WHERE user_id = $current_user_id
AND (SELECT count(*)
FROM approvals
WHERE recommendation_id = r.id) = 1;
Vermeiden Sie das Multiplizieren von Zeilen mit einem JOIN a priori, dann müssen Sie sie nicht zurück aggregieren.