De foutmelding vertelt je:
aggregaten niet toegestaan in WHERE-clausule
count()
is een verzamelfunctie. Gebruik daarvoor de HAVING-component.
De query kan er als volgt uitzien:
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
Met PostgreSQL 9.1 of hoger is het voldoende om GROUP BY
de primaire sleutel van een tabel (uitgaande van recommendations.id
is de PK). In Postgres-versies vóór 9.1 moest je alles . opnemen kolommen van de SELECT
lijst die niet zijn geaggregeerd in de GROUP BY
lijst. Met recommendations.*
in de SELECT
lijst, dat zou elke kolom van de tabel zijn.
Ik citeer de release-opmerkingen van PostgreSQL 9.1:
Niet-
GROUP BY
Allow toestaan kolommen in de zoekdoellijst wanneer de primaire sleutel is opgegeven in deGROUP BY
clausule (Peter Eisentraut)
Eenvoudiger met een subselectie
Hoe dan ook, dit is eenvoudiger en sneller door hetzelfde te doen:
SELECT *
FROM recommendations r
WHERE user_id = $current_user_id
AND (SELECT count(*)
FROM approvals
WHERE recommendation_id = r.id) = 1;
Vermijd het vermenigvuldigen van rijen met een JOIN
a priori, dan hoef je ze niet terug te aggregeren.