Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Erro relacionado a only_full_group_by ao executar uma consulta no MySql


Eu apenas adicionaria group_id para o GROUP BY .

Quando SELECT ndo uma coluna que não faz parte do GROUP BY pode haver vários valores para essa coluna dentro dos grupos, mas só haverá espaço para um único valor nos resultados. Assim, o banco de dados geralmente precisa ser dito exatamente como transformar esses múltiplos valores em um valor. Normalmente, isso é feito com uma função agregada como COUNT() , SUM() , MAX() etc... eu digo geralmente porque a maioria dos outros sistemas de banco de dados populares insistem nisso. No entanto, no MySQL anterior à versão 5.7, o comportamento padrão era mais tolerante porque não reclamaria e escolheria arbitrariamente qualquer valor ! Ele também tem um ANY_VALUE() função que poderia ser usada como outra solução para esta questão se você realmente precisasse do mesmo comportamento de antes. Essa flexibilidade tem um custo porque não é determinista, então eu não a recomendaria a menos que você tenha uma boa razão para precisar dela. MySQL agora está ativando o only_full_group_by configuração por padrão por boas razões, então é melhor se acostumar com isso e fazer com que suas consultas obedeçam a ele.

Então, por que minha resposta simples acima? Eu fiz algumas suposições:

1) o group_id é único. Parece razoável, afinal é um 'ID'.

2) o group_name também é único. Isso pode não ser uma suposição tão razoável. Se este não for o caso e você tiver alguns group_names duplicados e você segue meu conselho para adicionar group_id para o GROUP BY , você pode descobrir que agora obtém mais resultados do que antes porque os grupos com o mesmo nome agora terão linhas separadas nos resultados. Para mim, isso seria melhor do que ter esses grupos duplicados ocultos porque o banco de dados selecionou silenciosamente um valor arbitrariamente!

Também é uma boa prática qualificar todas as colunas com seu nome de tabela ou alias quando houver mais de uma tabela envolvida...
SELECT 
  g.group_id AS 'value', 
  g.group_name AS 'text' 
FROM mod_users_groups g
LEFT JOIN mod_users_data d ON g.group_id = d.group_id 
WHERE g.active = 1 
  AND g.department_id = 1 
  AND g.manage_work_orders = 1 
  AND g.group_name != 'root' 
  AND g.group_name != 'superuser' 
GROUP BY 
  g.group_name, 
  g.group_id 
HAVING COUNT(d.user_id) > 0 
ORDER BY g.group_name