PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PGError:ERROR:agregações não permitidas na cláusula WHERE em uma consulta AR de um objeto e seus objetos has_many


A mensagem de erro informa:

agregados não permitidos na cláusula WHERE

count() é uma função agregada. Use a cláusula HAVING para isso.
A consulta pode ficar assim:
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

Com o PostgreSQL 9.1 ou posterior é suficiente GROUP BY a chave primária de uma tabela (presumindo recommendations.id é o PK). Nas versões do Postgres anteriores a 9.1 você tinha que incluir todos colunas do SELECT lista que não está agregada no GROUP BY Lista. Com recommendations.* no SELECT list, que seria cada coluna da tabela.

Cito as notas de lançamento do PostgreSQL 9.1:

Permitir não GROUP BY colunas na lista de destino da consulta quando a chave primária é especificada no GROUP BY cláusula (Peter Eisentraut)

Mais simples com uma sub-seleção


De qualquer forma, isso é mais simples e rápido, fazendo o mesmo:
SELECT *
FROM   recommendations r
WHERE  user_id = $current_user_id
AND   (SELECT count(*)
       FROM   approvals
       WHERE  recommendation_id = r.id) = 1;

Evite multiplicar linhas com um JOIN a priori, então você não precisa agregá-los de volta.