2016-07-13 9 views
0

Ich habe die folgende Abfrage unten. Das Problem ist, dass ich diesen Fehler auslöst, wenn sie ausgeführt:Gruppierung erforderlich für Felder nicht aggregiert Fehler

column "v4.id" must appear in the GROUP BY clause or be used in an aggregate function 

die nicht viel Sinn macht, da ich nicht das Feld in einer Aggregat-Funktion. Irgendwelche Ideen, warum das so ist?

SELECT   c0."id", 
       c0."assigned_user_id", 
       c0."assigned_team_id", 
       c0."last_activity", 
       c0."last_message", 
       c3."unread_count", 
       c0."closed", 
       v4."name", 
       v4."avatar", 
       v4."id", 
       Count(c0."id") OVER() 
FROM   "conversations" AS c0 
LEFT OUTER JOIN "apps"   AS a1 
ON    a1."id" = c0."app_id" 
LEFT OUTER JOIN "conversation_users" AS c5 
ON    c5."conversation_id" = c0."id" 
LEFT OUTER JOIN "users" AS u2 
ON    c5."user_id" = u2."id" 
LEFT OUTER JOIN "conversation_users" AS c3 
ON    c3."conversation_id" = c0."id" 
LEFT OUTER JOIN "visitors" AS v4 
ON    v4."id" = c0."visitor_id" 
WHERE   (a1."id" = $1) 
AND    (u2."id" = $2) 
AND    (c3."user_id" = $3) 
GROUP BY  c0."id", 
ORDER BY  c0."last_activity" DESC ["ASnYW1-RgCl0I", "clt8ojxvk0000dp2fyvwq126", "clt8ojxvk0000dp2fyvwq126"] 
+0

Es scheint, dass Sie am Ende der GROUP BY-Klausel ein zusätzliches Komma haben. –

Antwort

3

Das heißt genau, warum Sie die Spalte in der group by wollen. Formal gesehen, sollten Sie wirklich alle nicht aggregierten Spalten in der group by haben:

group by c0."id", c0."assigned_user_id", c0."assigned_team_id", 
     c0."last_activity", c0."last_message", c0."closed", 
     c3."unread_count", 
     v4."name", v4."avatar", v4."id" 

Postgres eine Verlängerung (nach dem ANSI-Standard unterstützt), dass wir Sie primäre oder eindeutige Schlüssel in der group by und immer noch Zugang ersetzen andere Spalten. Ich habe dies nicht mit mehreren Tabellen verwendet, aber das funktioniert wahrscheinlich auch:

group by c0."id", 
     c3."unread_count", 
     v4."id" 

Darüber hinaus verwendet Ihre Auswahl eine Fensterfunktion. Warum haben Sie die over Klausel dort? Dies ist eine Aggregationsabfrage, daher ist dies in diesem Zusammenhang nicht sinnvoll.

+0

Da Sie "formal gesprochen" gesagt haben ... Alle nicht aggregierten Spalten in der SELECT-Liste _ (die nicht funktional von gruppierten Spalten abhängig sind) _ müssen in GROUP BY sein. Die Erweiterung, auf die Sie verweisen, kodifiziert diese Aussage. Z.B. Da 'c0.id' in der GROUP BY steht, müssen alle c0-Spalten nicht aufgelistet sein. –

+0

Ich sehe, der Grund für die "over" -Klausel ist, weil ich die genaue Menge der Datensätze (vor einer Limit-Klausel) in der gleichen Abfrage zurückgegeben werden soll – Tarlen

Verwandte Themen