Gibt es für mysql 5.6 eine ANY_VALUE-Funktion?

8

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 ist

Wenn 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?

    
Tim 07.05.2016, 13:47
quelle

3 Antworten

10

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.

%Vor%

Damit wird eine Zeile pro Land mit einem vorhersehbaren Bild angezeigt.

    
O. Jones 07.05.2016, 14:26
quelle
7

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.

    
trincot 07.05.2016 14:20
quelle
3

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).

    
e4c5 07.05.2016 14:24
quelle