2016-08-16 3 views
0

ich diesen Fehler:SQL ORDER BY-Klausel verursacht GROUP BY/Aggregat Fehler

PG::GroupingError: ERROR: column "relationships.created_at" must appear in the GROUP BY clause or be used in an aggregate function 

aus dieser Abfrage:

last_check = @user.last_check.to_i 
@new_relationships = User.select('*') 
         .from("(#{@rels_unordered.to_sql}) AS rels_unordered") 
         .joins(" 
        INNER JOIN relationships 
        ON   rels_unordered.id = relationships.character_id 
        WHERE  EXTRACT(EPOCH FROM relationships.created_at) > #{last_check} 
        ORDER BY relationships.created_at DESC 
        ") 

Ohne die ORDER BY-Linie, es funktioniert gut. Ich verstehe nicht, was die GROUP BY-Klausel ist. Wie bekomme ich es funktioniert und immer noch von relationship.created_at bestellen?

EDIT

Ich verstehe Sie GROUP BY relationships.created_at können. Aber ist Gruppieren nicht unnötig? Ist das Problem, dass relationship.created_at nicht in der SELECT enthalten ist? Wie schließt du es ein? Wenn Sie schon eine INNER JOIN mit relationships gemacht haben, warum ist die Hölle nicht relationships.created_at im Ergebnis ??

Ich habe gerade festgestellt, dass dies alles passiert, weil die Protokolle zeigen, dass die Abfrage mit SELECT COUNT(*) FROM.... beginnt. Also ist COUNT die Aggregatfunktion. Aber ich habe nie ein COUNT angefordert! Warum beginnt die Abfrage damit?

EDIT 2

Ok, scheint dies wegen des faulen anfragende zu geschehen. Das erste, was @new_relationships passiert, ist @new_relationships.any?. Dies betrifft die Abfrage und wandelt sie in eine Zählung um. Die Frage ist also, wie kann ich die Abfrage so ausführen, wie ursprünglich geplant? Und auch um zu überprüfen, ob @new_relationships leer ist, ohne die SQL-Abfrage zu beeinflussen?

+2

Mögliche Duplikat [Gibt es eine \ _VALUE Fähigkeit für MySQL 5.6?] (Http://stackoverflow.com/questions/37089347/is-there-any-value-capacity-for-mysql-5-6) – e4c5

+2

Bei GROUP BY (und SELECT DISTINCT und UNION) können nur SELECT-Listenelemente in ORDER BY angegeben werden. – jarlh

Antwort

0

Es fragt nach einer GROUP BY nach Ihrer FROM Klausel in Ihrem EXTRACT (im Wesentlichen ein Subselect). Es gibt Möglichkeiten, aber ich habe festgestellt, dass es oft einfacher ist, einen GROUP BY arbeiten zu lassen. Versuchen Sie Folgendes: ... FROM relationships.created_at GROUP BY id oder welche Indexierungsspalte Sie aus dieser Tabelle verwenden. Es scheint, als ob Ihr ORDER BY sich selbst widerspricht. Durch die Gruppierung der Subselect-Daten sollte der Konflikt verloren gehen.

+0

NB: Während es den Konflikt verlieren sollte, kann es auch gewünschte Daten aus Ihrer Ausgabe zu beseitigen, wenn das passiert Beispieltabellen würde Ihnen helfen, die richtige Syntax – Jackson

1

Sie müssen nur Gruppe mit Ihrer Bestellung durch Klausel entlang hinzufügen

last_check = @user.last_check.to_i  
@new_relationships = 
    User.select('"rels_unordered".*') 
     .from("(#{@rels_unordered.to_sql}) AS rels_unordered") 
     .joins("INNER JOIN relationships 
       ON rels_unordered.id = relationships.character_id 
       WHERE EXTRACT(EPOCH FROM relationships.created_at) > #{last_check} 
       GROUP BY relationships.created_at 
       ORDER BY relationships.created_at DESC ") 
+0

Entschuldigen Sie Ihre Antwort nicht akzeptieren, aber: die Änderung vorgeschlagen, arbeitete zunächst, aber Es beschwert sich jetzt, dass 'rels_unordered.id in der GROUP BY-Klausel erscheinen muss oder in einer Aggregatfunktion verwendet werden muss. Wäre es besser, eine 'GROUP BY'-Klausel ganz zu vermeiden und stattdessen 'relationship.created_at' in die Aggregatfunktion aufzunehmen? Wie würde das codiert werden? – Bazley