Je suis en train d'ajouter des fonctionnalités à une application pré-existante et je suis tombé sur une vue MySQL quelque chose comme ceci:MySQL - Sélection d'une colonne non dans le groupe par
SELECT
AVG(table_name.col1),
AVG(table_name.col2),
AVG(table_name.col3),
table_name.personID,
table_name.col4
FROM table_name
GROUP BY table_name.personID;
OK donc il y a quelques fonctions d'agrégation. Vous pouvez sélectionner personID parce que vous le groupez. Mais il sélectionne également une colonne qui n'est pas dans une fonction d'agrégat et qui ne fait pas partie de la clause GROUP BY. Comment est-ce possible??? Choisit-il simplement une valeur aléatoire parce que les valeurs ne sont pas uniques par groupe?
D'où je viens (MSSQL Server), c'est une erreur. Quelqu'un peut-il m'expliquer ce comportement et pourquoi est-il autorisé dans MySQL?
Je voudrais faire remarquer que ce n'est pas tout à fait vrai. A partir de ANSI SQL-99, les champs sélectionnés doivent être des agrégats, dépendent fonctionnellement de la clause group by. Donc, la sélection de user_name lors du regroupement par user_id est totalement correcte. SQL Server et Oracle ne le respectent pas, car ils ne permettent pas de sélectionner user_name lorsque seul user_id figure dans le groupe par liste; et MySQL n'est pas conforme, car il ne vérifie pas si chaque colonne sélectionnée dépend vraiment de user_id. –
@ThorstenKettner, merci, vous avez raison. MySQL 5.7 a été amélioré, et il est beaucoup plus intelligent dans ce cas de support ANSI SQL. –