PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PGError :ERREUR :agrégats non autorisés dans la clause WHERE sur une requête AR d'un objet et de ses objets has_many

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 le GROUP 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.