Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL - Selezione di una colonna non in Raggruppamento

È vero che questa funzione consente alcune query ambigue e restituisce silenziosamente un set di risultati con un valore arbitrario prelevato da quella colonna. In pratica, tende ad essere il valore della riga all'interno del gruppo che viene memorizzato fisicamente per primo.

Queste query non sono ambigue se scegli solo colonne che dipendono funzionalmente dalle colonne nei criteri GROUP BY. In altre parole, se può esserci un solo valore distinto della colonna "ambigua" per valore che definisce il gruppo, non c'è problema. Questa query sarebbe illegale in Microsoft SQL Server (e ANSI SQL), anche se logicamente non può comportare ambiguità:

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

Inoltre, MySQL ha una modalità SQL per farlo comportare secondo lo standard:ONLY_FULL_GROUP_BY

FWIW, SQLite consente anche queste ambigue clausole GROUP BY, ma sceglie il valore dall'ultimo riga nel gruppo.

Almeno nella versione che ho provato. Cosa significa essere arbitrari è che MySQL o SQLite potrebbero cambiare la loro implementazione in futuro e avere un comportamento diverso. Pertanto, non dovresti fare affidamento sul comportamento che rimane come è attualmente in casi ambigui come questo. È meglio riscrivere le tue query in modo che siano deterministiche e non ambigue. Ecco perché MySQL 5.7 ora abilita ONLY_FULL_GROUP_BY per impostazione predefinita.