PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PGError:FEHLER:Aggregate sind in der WHERE-Klausel bei einer AR-Abfrage eines Objekts und seiner has_many-Objekte nicht zulässig

Die Fehlermeldung sagt Ihnen:

Aggregate in WHERE-Klausel nicht erlaubt

count() ist eine Aggregatfunktion. Verwenden Sie dafür die HAVING-Klausel.
Die Abfrage könnte so aussehen:

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

Mit PostgreSQL 9.1 oder höher reicht es aus, GROUP BY zu verwenden der Primärschlüssel einer Tabelle (vorausgesetzt recommendations.id ist die PK). In Postgres-Versionen vor 9.1 mussten Sie all einschließen Spalten des SELECT Liste, die nicht in GROUP BY aggregiert sind aufführen. Mit recommendations.* im SELECT Liste, das wäre jede einzelne Spalte der Tabelle.

Ich zitiere die Versionshinweise von PostgreSQL 9.1:

Nicht-GROUP BY zulassen Spalten in der Abfragezielliste, wenn der Primärschlüssel in GROUP BY angegeben ist Klausel (Peter Eisentraut)

Einfacher mit einer Unterauswahl

In beiden Fällen ist dies einfacher und schneller, wenn Sie dasselbe tun:

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

Vermeiden Sie das Multiplizieren von Zeilen mit einem JOIN a priori, dann müssen Sie sie nicht zurück aggregieren.