Fejlmeddelelsen fortæller dig:
aggregater er ikke tilladt i WHERE-klausulen
count()
er en aggregeret funktion. Brug HAVING-sætningen til det.
Forespørgslen kunne se sådan ud:
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 nyere er det nok at GROUP BY
den primære nøgle af en tabel (forudsat recommendations.id
er PK). I Postgres-versioner før 9.1 skulle du inkludere alle kolonner i SELECT
liste, der ikke er samlet i GROUP BY
liste. Med recommendations.*
i SELECT
liste, det ville være hver enkelt kolonne i tabellen.
Jeg citerer udgivelsesnoterne til PostgreSQL 9.1:
Tillad ikke-GROUP BY
kolonner i forespørgselsmållisten, når primærnøglen er angivet i GROUP BY
klausul (Peter Eisentraut)
Enklere med et undervalg
Uanset hvad, er dette enklere og hurtigere ved at gøre det samme:
SELECT *
FROM recommendations r
WHERE user_id = $current_user_id
AND (SELECT count(*)
FROM approvals
WHERE recommendation_id = r.id) = 1;
Undgå at gange rækker med en JOIN
a priori, så behøver du ikke at samle dem tilbage.