sql >> Base de Datos >  >> RDS >> PostgreSQL

PGError:ERROR:agregados no permitidos en la cláusula WHERE en una consulta AR de un objeto y sus objetos has_many

El mensaje de error te dice:

agregados no permitidos en la cláusula WHERE

count() es una función agregada. Use la cláusula HAVING para eso.
La consulta podría verse así:

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 posterior es suficiente GROUP BY la clave principal de una tabla (suponiendo recommendations.id es el PK). En las versiones de Postgres anteriores a la 9.1, tenía que incluir todos columnas del SELECT lista que no están agregadas en el GROUP BY lista. Con recommendations.* en el SELECT lista, serían todas las columnas de la tabla.

Cito las notas de la versión de PostgreSQL 9.1:

Permitir no GROUP BY columnas en la lista de objetivos de consulta cuando la clave principal se especifica en GROUP BY cláusula (Peter Eisentraut)

Más simple con una subselección

De cualquier manera, esto es más simple y rápido, haciendo lo mismo:

SELECT *
FROM   recommendations r
WHERE  user_id = $current_user_id
AND   (SELECT count(*)
       FROM   approvals
       WHERE  recommendation_id = r.id) = 1;

Evite multiplicar filas con JOIN a priori, entonces no tienes que volver a agregarlos.