sql >> Database >  >> RDS >> PostgreSQL

PGError:ERROR:aggregaties niet toegestaan ​​in WHERE-clausule op een AR-query van een object en zijn has_many objecten

De foutmelding vertelt je:

aggregaten niet toegestaan ​​in WHERE-clausule

count() is een verzamelfunctie. Gebruik daarvoor de HAVING-component.
De query kan er als volgt uitzien:

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

Met PostgreSQL 9.1 of hoger is het voldoende om GROUP BY de primaire sleutel van een tabel (uitgaande van recommendations.id is de PK). In Postgres-versies vóór 9.1 moest je alles . opnemen kolommen van de SELECT lijst die niet zijn geaggregeerd in de GROUP BY lijst. Met recommendations.* in de SELECT lijst, dat zou elke kolom van de tabel zijn.

Ik citeer de release-opmerkingen van PostgreSQL 9.1:

Niet-GROUP BY Allow toestaan kolommen in de zoekdoellijst wanneer de primaire sleutel is opgegeven in de GROUP BY clausule (Peter Eisentraut)

Eenvoudiger met een subselectie

Hoe dan ook, dit is eenvoudiger en sneller door hetzelfde te doen:

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

Vermijd het vermenigvuldigen van rijen met een JOIN a priori, dan hoef je ze niet terug te aggregeren.



  1. Algemene logboeken en foutlogboeken inschakelen in AWS RDS

  2. SQL:ontleden de voor-, middelste en achternaam uit een veld met volledige naam

  3. Hoe PHP MySQL-databaseverbinding te testen met behulp van script

  4. Impact van de query_post_execution_showplan Extended Event in SQL Server 2012