Le message d'erreur vous indique :
agrégats non autorisés dans la clause WHERE
count()
est une fonction d'agrégation. Utilisez la clause HAVING pour cela.
La requête pourrait ressembler à ceci :
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
Avec PostgreSQL 9.1 ou ultérieur, il suffit de GROUP BY
la clé primaire d'un tableau (en supposant recommendations.id
est le PK). Dans les versions de Postgres antérieures à la 9.1, vous deviez inclure tous colonnes du SELECT
liste qui ne sont pas agrégées dans le GROUP BY
liste. Avec recommendations.*
dans le SELECT
liste, ce serait chaque colonne du tableau.
Je cite les notes de version de PostgreSQL 9.1 :
Autoriser non-
GROUP BY
colonnes dans la liste cible de la requête lorsque la clé primaire est spécifiée dans leGROUP BY
clause (Peter Eisentraut)
Plus simple avec une sous-sélection
Quoi qu'il en soit, c'est plus simple et plus rapide, en faisant la même chose :
SELECT *
FROM recommendations r
WHERE user_id = $current_user_id
AND (SELECT count(*)
FROM approvals
WHERE recommendation_id = r.id) = 1;
Évitez de multiplier les lignes avec un JOIN
a priori, alors vous n'avez pas à les agréger.