web-dev-qa-db-de.com

Fehlercode: 1055 inkompatibel mit sql_mode = only_full_group_by

Ich hatte Probleme beim Wechsel zu einer Offline-Version der Lahman SQL-Baseballdatenbank. Ich habe ein Terminal verwendet, das in einen EDX-Kurs eingebettet ist. Dieser Befehl wird auf dem Web-Terminal problemlos ausgeführt:

SELECT concat(m.nameFirst,concat(" ",m.nameLast)) as Player,
    p.IPOuts/3 as IP,
    p.W,p.L,p.H,p.BB,p.ER,p.SV,p.SO as K,
    p.IPOuts+p.W*5+p.SV+p.SO-p.BB-p.L-p.H as PTS,
    p.yearID as Year
FROM Pitching p
Inner Join Master m
    ON p.playerID=m.playerID
WHERE p.yearID=2014 AND p.IPOuts>=50
GROUP BY m.playerID
ORDER BY PTS DESC;

Welches SQL 5.5.46 ausführt, aber wenn ich meine Offline-Version verwende, die 5.7.10 ausführt, erhalte ich den folgenden Fehlercode:

Fehlercode: 1055. Ausdruck Nr. 1 der SELECT-Liste befindet sich nicht in der GROUP BY-Klausel und enthält die nicht aggregierte Spalte 'stats.m.nameFirst', die funktional nicht von den Spalten in der GROUP BY-Klausel abhängig ist. Dies ist nicht kompatibel mit sql_mode = only_full_group_by

Ich habe viele Lösungen für die Probleme der Menschen gelesen, aber sie haben in diesem Fall nicht geholfen. Das ist noch nie passiert, also denke ich, dass dies entweder sehr offensichtlich ist oder dass ich beim Codieren in Ordnung bin. Wie auch immer, weiß jemand, wie man das behebt?

16
Frydaddy07

In 5.7 ist der sqlmode standardmäßig auf Folgendes eingestellt:

 ONLY_FULL_GROUP_BY,NO_AUTO_CREATE_USER,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

So entfernen Sie die Klausel ONLY_FULL_GROUP_BY:

SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

Dies setzt voraus, dass Sie GROUP BY mit nicht aggregierten Spalten erstellen müssen.

Grüße

43
White Feather

Die oben akzeptierte Lösung hat bei mir in Version 5.7.9, for osx10.9 (x86_64) nicht funktioniert.

Dann hat folgendes geklappt -

set global sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
25
Anis

Für andere Anwendungsfälle: Sie müssen ONLY_FULL_GROUP_BY Nicht unbedingt deaktivieren. In einem solchen Fall ist diese Abfrage laut mysql docs ungültig, wenn name kein Primärschlüssel von t oder eine eindeutige NOT NULL-Spalte ist In diesem Fall kann keine funktionale Abhängigkeit abgeleitet werden und ein Fehler tritt auf:

SELECT name, address, MAX(age) FROM t GROUP BY name;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP
BY clause and contains nonaggregated column 'mydb.t.address' which
is not functionally dependent on columns in GROUP BY clause; this
is incompatible with sql_mode=only_full_group_by

Stattdessen können Sie ANY_VALUE('my_column_name') my_column_name verwenden. In den mysql-Dokumenten wird in Anführungszeichen Folgendes angegeben: "In diesem Fall ignoriert MySQL den Nichtdeterminismus von Adresswerten innerhalb jeder Namensgruppe und akzeptiert die Abfrage." Verwenden Sie ANY_VALUE (), um auf Adresse zu verweisen:

SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;
6
phil