J'ajouterais simplement group_id
au GROUP BY
.
Lorsque SELECT
ing une colonne qui ne fait pas partie du GROUP BY
il peut y avoir plusieurs valeurs pour cette colonne dans les groupes, mais il n'y aura de place que pour une seule valeur dans les résultats. Ainsi, la base de données habituellement doit savoir exactement comment transformer ces multiples valeurs en une seule valeur. Généralement, cela se fait avec une fonction d'agrégation comme COUNT()
, SUM()
, MAX()
etc... Je dis habituellement car la plupart des autres systèmes de base de données populaires insistent sur cela. Cependant, dans MySQL avant la version 5.7, le comportement par défaut était plus indulgent car il ne se plaindrait pas et choisirait ensuite arbitrairement n'importe quelle valeur ! Il a également un ANY_VALUE()
fonction qui pourrait être utilisée comme une autre solution à cette question si vous aviez vraiment besoin du même comportement qu'avant. Cette flexibilité a un coût car elle est non déterministe, donc je ne la recommanderais pas à moins que vous n'ayez une très bonne raison d'en avoir besoin. MySQL active maintenant le only_full_group_by
paramètre par défaut pour de bonnes raisons, il est donc préférable de s'y habituer et de faire en sorte que vos requêtes s'y conforment.
Alors pourquoi ma réponse simple ci-dessus? J'ai fait quelques hypothèses :
1) le group_id
est unique. Cela semble raisonnable, c'est une 'ID' après tout.
2) le group_name
est également unique. Ce n'est peut-être pas une hypothèse aussi raisonnable. Si ce n'est pas le cas et que vous avez des group_names
en double et vous suivez ensuite mes conseils pour ajouter group_id
au GROUP BY
, vous constaterez peut-être que vous obtenez désormais plus de résultats qu'auparavant, car les groupes portant le même nom auront désormais des lignes distinctes dans les résultats. Pour moi, ce serait mieux que de masquer ces groupes en double car la base de données a discrètement sélectionné une valeur de manière arbitraire !
Il est également recommandé de qualifier toutes les colonnes avec leur nom de table ou leur alias lorsqu'il y a plus d'une table impliquée...
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