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 BY
kolumner i frågemållistan när primärnyckeln anges iGROUP BY
klausul (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.