2010-10-15 4 views
0

J'ai une requête comme ceci:MySQL GROUP BY, et tester les éléments regroupés

select a, b, c, group_concat(d separator ', ') 
from t 
group by a; 

Cela semble fonctionner très bien. Si je comprends bien (! Pardonnez-moi, je suis un rookie MySQL), il est de retour des lignes de:

  • chaque a valeur unique
  • pour chaque valeur a, un b et c valeur
  • aussi pour chaque valeur a, toutes les valeurs, d concaténée en une chaîne

C'est ce que je veux, mais je veux également vérifier que pour chaque a, le b et c sont toujours les mêmes, pour toutes les lignes ayant cette valeur a.

Ma première pensée est de comparer:

select count(*) from t group by a, b, c; 

avec:

select count(*) from t group by a; 

et assurez-vous qu'ils sont égaux. Mais je ne me suis pas convaincu que c'est correct, et je ne suis certainement pas sûr qu'il n'y a pas de meilleur moyen. Existe-t-il un idiome SQL/MySQL pour cela?

Merci!

Répondre

1

Le problème avec se fondant sur MySQL's Hidden Columns functionality is spelled out in the documentation:

Lorsque vous utilisez cette fonction, toutes les lignes de chaque groupe doivent avoir les mêmes valeurs pour les colonnes du omises GROUP BY. Le serveur est libre de renvoyer n'importe quelle valeur du groupe, de sorte que les résultats sont indéterminés sauf si toutes les valeurs sont identiques.

Appliqué à votre exemple, cela signifie que les valeurs de b et c sont arbitraires - les résultats ne peuvent pas compter sur eux pour revenir toujours la même valeur, et la probabilité de voir les hausses de comportement avec le nombre de valeurs possibles que b/c peut retourner. Donc, il n'y a pas beaucoup de valeur à comparer à GROUP BY a et GROUP BY a, b, c ...

+0

Je ne comprends pas votre dernier commentaire. Oui, dans la requête réelle, je sais que les 'b' et' c' sont arbitraires, c'est pourquoi je veux confirmer indépendamment que chaque 'a' n'a qu'un' b' et un 'c'. Si je «groupe par a», cela me dit combien il y a de «a». Si je groupe par a, b, c, cela me dit combien il y a de triplets uniques (a, b, c). Comment cela manque-t-il de valeur à mon problème? – Ken

+0

@Ken: Votre comparaison vous donne une approximation - cela dépend du nombre de valeurs différentes dans la colonne. Tout ce que je vois que vous pouvez faire est de dire "oui, GROUP BY a, b, c confirme que les valeurs b et c sont possibles" - mais SQL ne renverra pas les valeurs qui n'existent pas dans la colonne, alors quel est le point de la comparaison? –

+0

Ça ne me dit rien du tout: je fais count (*) sur les groupements. Il me dit que le nombre de a est le même que le nombre de (a, b, c) triples. Est-ce que ce n'est pas correct? – Ken