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ãoGROUP BY
colunas na lista de destino da consulta quando a chave primária é especificada noGROUP 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.