Il messaggio di errore ti dice:
aggregati non consentiti nella clausola WHERE
count()
è una funzione aggregata. Usa la clausola HAVING per questo.
La query potrebbe essere simile a questa:
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
Con PostgreSQL 9.1 o successivo è sufficiente GROUP BY
la chiave primaria di una tabella (presupponendo recommendations.id
è il PK). Nelle versioni di Postgres precedenti alla 9.1 dovevi includere tutti colonne del SELECT
elenco che non sono aggregati nel GROUP BY
elenco. Con recommendations.*
nel SELECT
list, che sarebbe ogni singola colonna della tabella.
Cito le note di rilascio di PostgreSQL 9.1:
Consenti non GROUP BY
colonne nell'elenco di destinazione della query quando la chiave primaria è specificata in GROUP BY
clausola (Peter Eisentraut)
Più semplice con una selezione secondaria
Ad ogni modo, questo è più semplice e veloce, facendo lo stesso:
SELECT *
FROM recommendations r
WHERE user_id = $current_user_id
AND (SELECT count(*)
FROM approvals
WHERE recommendation_id = r.id) = 1;
Evita di moltiplicare le righe con un JOIN
a priori, quindi non è necessario aggregarli nuovamente.