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?
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
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';
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;