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