Por que o ONLY_FULL_GROUP_BY é importante no MySQL?
Quando o modo ONLY_FULL_GROUP_BY está desativado, o MySQL permite consultas GROUP BY que selecionam colunas que não estão nem no GROUP BY nem em funções de agregação, como COUNT(), MAX(), MIN() ou SUM().
Isso pode parecer prático, mas pode gerar resultados imprevisíveis.
Por exemplo, ao agrupar registros por usuário, mas selecionar também uma coluna que possui vários valores diferentes dentro daquele grupo, o MySQL fica livre para escolher qualquer valor. Ou seja, o resultado pode não ser determinístico.
Um detalhe importante: adicionar ORDER BY não resolve esse problema. A ordenação acontece depois que o MySQL já escolheu os valores de cada grupo. Portanto, o ORDER BY não controla qual valor será escolhido dentro do agrupamento.
Desativar o ONLY_FULL_GROUP_BY só faz sentido quando você tem certeza de que, para cada grupo, os valores das colunas não agregadas serão sempre iguais.
Na prática, manter o ONLY_FULL_GROUP_BY ativado ajuda a evitar consultas ambíguas e força o desenvolvedor a escrever SQL mais correto, previsível e seguro.
- verificar o estado atual
SELECT @@sql_mode LIKE '%ONLY_FULL_GROUP_BY%' AS only_full_group_by_ativo;se o resultado for:
1 = ativo
0 = desativadoPara habilitar se forma permanente abrir o my.ini do mysqlserver e adicione a seguinte linha
# habilita o ONLY_FULL_GROUP_BY
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTIONreinicie o servidor mysql e pronto!
ref: MySQL :: MySQL 9.7 Reference Manual :: 14.19.3 MySQL Handling of GROUP BY