PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PGError:ERROR:aggregati non consentiti nella clausola WHERE su una query AR di un oggetto e dei suoi has_many objects

Il messaggio di errore ti dice:

aggregati non consentiti nella clausola WHERE

count() è una funzione aggregata. Usa la clausola HAVING per questo.
La query potrebbe essere simile a questa:

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 successivo è sufficiente GROUP BY la chiave primaria di una tabella (presupponendo recommendations.id è il PK). Nelle versioni di Postgres precedenti alla 9.1 dovevi includere tutti colonne del SELECT elenco che non sono aggregati nel GROUP BY elenco. Con recommendations.* nel SELECT list, che sarebbe ogni singola colonna della tabella.

Cito le note di rilascio di PostgreSQL 9.1:

Consenti non GROUP BY colonne nell'elenco di destinazione della query quando la chiave primaria è specificata in GROUP BY clausola (Peter Eisentraut)

Più semplice con una selezione secondaria

Ad ogni modo, questo è più semplice e veloce, facendo lo stesso:

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

Evita di moltiplicare le righe con un JOIN a priori, quindi non è necessario aggregarli nuovamente.