GROUP BY Syntaxe Mysql - Quitter une colonne groupable

Narktor:

Je Tableau A avec des colonnes X, Y, Z.

X est un FK, Y est une description. Chaque X a exactement un correspondant Y. Donc, si X reste le même sur plusieurs enregistrements, Y reste le même aussi. Donc, il peut y avoir un certain nombre de dossiers où X et Y sont les mêmes.

Maintenant, je suis en cours d'exécution de la requête suivante:

SELECT X, Y
FROM A
GROUP BY X;

Est-ce que ce travail de recherche? Y est censé être regroupés aux côtés de X, mais je na pas préciser dans explicitement la requête. Est-ce que MySQL agit toujours de cette façon si implicitement? Et est ce comportement / fiable standardisé? En outre, les résultats seront varient en fonction du type de données de Y. Par exemple, est-il une différence si Y est VARCHAR, CHAR ou INT? Dans le cas d'un int, sera le résultat d'une SOMME () des dossiers regroupés?

Le MySQL comportement va exposer dans un tel cas normés / normalisé et où puis-je regarder vers le haut?

GMB:

Chacun Xa exactement un correspondantY

SELECT X, Y FROM A GROUP BY X;

Est-ce que ce travail de recherche?

Techniquement, ce qui se passe lorsque vous exécutez cette requête sous MySQL dépend wether SQL mode ONLY_FULL_GROUP_BYest activé ou non:

  • elle est activée, les erreurs de requête: toutes les colonnes non agrégées doivent apparaître dans la GROUP BYclause (vous devez ajouter Yà la GROUP BYclause)

  • Sinon, les exécute la requête, et vous donne une quelconque valeur Ypour chaque X; mais depuis Yest dépendante functionnaly sur X, la valeur est en réalité prévisible, donc c'est OK.

En général, bien que la norme SQL ne reconnaît la notion de colonne dépendante functionnaly, il est une bonne pratique toujours inclure tous les colums non agrégées dans la GROUP BYclause. Il est également une exigence dans la plupart des bases de données autres que MySQL (et, à partir de MySQL 5.7, ONLY_FULL_GROUP_BYest activé par défaut). Cela vous empêche également de divers pièges et comportements imprévisibles.

L' utilisation ANY_VALUE()rend la requête valide et explicite sur son objectif:

SELECT X, ANY_VALUE(Y) FROM A GROUP BY X;

Notez que si vous souhaitez que les combinaisons distinctes X, Y, il est plus simple à utiliser SELECT DISTINCT:

SELECT DISTINCT X, Y FROM A;

Je suppose que tu aimes

Origine http://10.200.1.11:23101/article/api/json?id=395424&siteId=1
conseillé
Classement