sql >> Databasteknik >  >> RDS >> PostgreSQL

PGError:ERROR:aggregeringar är inte tillåtna i WHERE-satsen på en AR-fråga för ett objekt och dess has_many-objekt

Felmeddelandet talar om för dig:

aggregat är inte tillåtna i WHERE-satsen

count() är en aggregerad funktion. Använd HAVING-satsen för det.
Frågan kan se ut så här:

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

Med PostgreSQL 9.1 eller senare räcker det med att GROUP BY den primära nyckeln av en tabell (förutsatt recommendations.id är PK). I Postgres-versioner före 9.1 var du tvungen att inkludera alla kolumner i SELECT lista som inte är samlade i GROUP BY lista. Med recommendations.* i SELECT listan, det skulle vara varje kolumn i tabellen.

Jag citerar releasenoteserna för PostgreSQL 9.1:

Tillåt icke-GROUP BY kolumner i frågemållistan när primärnyckeln anges i GROUP BY klausul (Peter Eisentraut)

Enklare med ett underval

Hur som helst, det här är enklare och snabbare, gör detsamma:

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

Undvik att multiplicera rader med en JOIN a priori, då behöver du inte samla tillbaka dem.



  1. isnumeric() med PostgreSQL

  2. Multi-DC PostgreSQL:Konfigurera en standby-nod på en annan geografisk plats över en VPN

  3. Arbeta runt MySQL-felet Deadlock hittades när man försökte få lås; försök starta om transaktionen

  4. Skillnad mellan dessa två anslutningstabeller?