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.