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.