Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL - Auswählen einer Spalte, die nicht in Gruppieren nach enthalten ist

Es ist wahr, dass diese Funktion einige mehrdeutige Abfragen zulässt und stillschweigend eine Ergebnismenge mit einem willkürlichen Wert zurückgibt, der aus dieser Spalte ausgewählt wurde. In der Praxis wird in der Regel der Wert aus der Zeile innerhalb der Gruppe zuerst physisch gespeichert.

Diese Abfragen sind nicht mehrdeutig, wenn Sie nur Spalten auswählen, die funktional von der/den Spalte(n) in den GROUP BY-Kriterien abhängig sind. Mit anderen Worten, wenn es nur einen eindeutigen Wert der "mehrdeutigen" Spalte pro Wert geben kann, der die Gruppe definiert, gibt es kein Problem. Diese Abfrage wäre in Microsoft SQL Server (und ANSI SQL) illegal, obwohl sie logischerweise nicht zu Mehrdeutigkeiten führen kann:

SELECT AVG(table1.col1), table1.personID, persons.col4
FROM table1 JOIN persons ON (table1.personID = persons.id)
GROUP BY table1.personID;

Außerdem hat MySQL einen SQL-Modus, damit es sich gemäß dem Standard verhält:ONLY_FULL_GROUP_BY

FWIW, SQLite erlaubt auch diese mehrdeutigen GROUP BY-Klauseln, aber es wählt den Wert vom letzten Zeile in der Gruppe.

Zumindest in der von mir getesteten Version. Was es bedeutet, willkürlich zu sein ist, dass entweder MySQL oder SQLite ihre Implementierung in Zukunft ändern und ein anderes Verhalten haben könnten. Sie sollten sich daher in unklaren Fällen wie diesem nicht darauf verlassen, dass das Verhalten so bleibt, wie es derzeit ist. Es ist besser, Ihre Abfragen so umzuschreiben, dass sie deterministisch und nicht mehrdeutig sind. Aus diesem Grund aktiviert MySQL 5.7 jetzt standardmäßig ONLY_FULL_GROUP_BY.