Derzeit arbeite ich mit MySQL 5.7 in der Entwicklung und 5.6 in der Produktion. Jedes Mal, wenn ich eine Abfrage mit einer Gruppe durch in der Entwicklung ausführe, erhalte ich einen Fehler wie "Error Code: 1055. Ausdruck # 1 der SELECT-Liste ist nicht in GROUP BY"
Hier ist die Abfrage.
%Vor%Zum Lösen verwende ich die mysql-Funktion von 5.7 ANY_VALUE, aber das Hauptproblem ist, dass es in mysql 5.6
nicht verfügbar istWenn ich also die SQL-Anweisung für die Entwicklung behebe, erhalte ich einen Fehler in der Produktion.
Kennen Sie eine Lösung oder ein Polfil für die ANY_VALUE-Funktion in MySQL 5.6?
Sie missbrauchen die notorische nicht standardmäßige MySQL-Erweiterung für GROUP BY . Standard-SQL lehnt Ihre Abfrage immer ab, weil Sie Spalten angeben, die keine Aggregate sind und nicht in GROUP BY
erwähnt werden. In deinem Dev-System versuchst du das mit ANY_VALUE()
zu umgehen.
In der Produktion können Sie den ONLY_FULL_GROUP_BY MySQL-Modus ausschalten. > Versuchen Sie dies :
%Vor%Dadurch kann MySQL Ihre Anfrage akzeptieren.
Aber schau, deine Anfrage ist nicht wirklich korrekt. Wenn Sie es zum Ausführen überreden können, wird eine zufällig ausgewählte Zeile aus der Tabelle images
zurückgegeben. Diese Art von Unbestimmtheit führt häufig zu Verwirrung bei den Benutzern und der technischen Unterstützung.
Warum nicht die Abfrage besser machen, also wählt sie ein bestimmtes Bild aus. Wenn Ihre Tabelle images
eine Spalte autoincrement id
hat, können Sie das "erste" Bild auswählen.
Damit wird eine Zeile pro Land mit einem vorhersehbaren Bild angezeigt.
Anstelle von ANY_VALUE
könnten Sie verwenden Die Funktionen MIN
oder MAX
aggregieren.
Alternativ können Sie in Erwägung ziehen, ONLY_FULL_GROUP_BY
nicht festzulegen SQL-Modus, der standardmäßig für MySql 5.7 festgelegt ist und für den Unterschied verantwortlich ist, den Sie mit MySql 5.6 erfahren. Dann können Sie die Aktualisierung Ihrer Abfragen verzögern, bis Sie alle Ihre Umgebungen auf MySql 5.7 migriert haben.
Welche der beiden Optionen die bessere Option ist, ist fraglich, aber auf lange Sicht ist es besser, Ihre Abfragen so anzupassen, dass sie der ONLY_FULL_GROUP_BY
-Regel entsprechen. Die Verwendung von MIN
oder MAX
kann dabei sicherlich nützlich sein.
Seit Jahrzehnten könnten Sie Abfragen schreiben, die in Standard-SQL nicht gültig sind, aber absolut gültige mysql
In Standard-SQL kann eine Abfrage, die eine GROUP BY-Klausel enthält, nicht verweisen Nicht aggregierte Spalten in der Auswahlliste, die nicht in der Liste aufgeführt sind GROUP BY-Klausel. Diese Abfrage ist beispielsweise in Standard-SQL unzulässig weil die nicht aggregierte Namensspalte in der Auswahlliste dies nicht tut erscheinen in der GROUP BY:
SELECT o.custid, c.name, MAX (o.Payment) FROM Bestellungen AS o, Kunden AS c WO o.custid = c.custid GROUP BY o.custid; Für die Abfrage zu legal sein, muss die Namensspalte in der Auswahlliste oder weggelassen werden in der GROUP BY-Klausel benannt.
MySQL erweitert die Standard-SQL-Verwendung von GROUP BY um die Auswahlliste kann sich auf nicht aggregierte Spalten beziehen, die nicht in der GROUP BY-Klausel benannt sind.
Dies kommt von der Mysql 5.6-Handbuchseite auf GROUP BY . Wenn Sie auf die gleiche Seite für 5.7.6 schauen, sehen Sie das Dinge haben sich geändert. Und hat sich dramatisch verändert !!
Diese Seite gibt Ihnen auch die Lösung. Deaktivieren Sie ONLY_FULL_GROUP_BY
Das macht es möglich, dass Ihre alte 5.6-Abfrage auf 5.7.6 funktioniert (entfernen Sie ANY_VALUE aus Ihrer Abfrage, da diese in 5.7.6 nicht verfügbar ist, verwenden Sie stattdessen stattdessen ONLY_FULL_GROUP_BY).
Tags und Links mysql aggregate-functions group-by mysql-error-1055