Est-il possible de GROUPER plusieurs colonnes en utilisant MySQL?

206

Est-il possible de GROUP BYplus d'une colonne dans une SELECTrequête MySQL ? Par exemple:

GROUP BY fV.tier_id AND 'f.form_template_id'
Pensée de Rhys
la source
3
Vous ne pouvez pas grouper par lignes. Vous pouvez cependant grouper par colonnes
Joe Phillips
Quelle est cette version de la syntaxe: stackoverflow.com/questions/2421388/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Vous devrez peut-être effectuer une sous-requête au lieu d'utiliser plusieurs clauses group by.
Adam F
Bien que la plupart des réponses à vote élevé soient essentiellement les mêmes les unes les autres (elles montrent la syntaxe correcte et expliquent l'effet du changement de l'ordre des deux colonnes), si votre besoin est quelque peu différent, considérez la réponse de Daniklad .
ToolmakerSteve

Réponses:

292
GROUP BY col1, col2, col3
Joe Phillips
la source
107

Oui, vous pouvez regrouper par plusieurs colonnes. Par exemple,

SELECT * FROM table
GROUP BY col1, col2

Les résultats seront d'abord regroupés par col1, puis par col2. Dans MySQL, la préférence de colonne va de gauche à droite.

php
la source
5
La préférence de gauche à droite est appliquée à l'ordre croissant des regroupements et non à la préférence de groupe de colonnes. GROUP BYs'applique col1+col2. par exemple, col1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2et l'exécution GROUP BY col1,col2reviendrait 1,1|1,3|2,2par opposition à 1,1|2,2comme suggéré. Alors GROUP BY col2, col1que changerait l'ordre croissant de retour de col2. 1,1|2,2|1,3 Démo: sqlfiddle.com/#!9/d5f69/1 Notez que l'ID de ligne: 2 est retourné dans les deux cas pour 2,2malgré l'inversion des colonnes.
fyrye
Encore un test. sqlfiddle.com/#!9/5c8763/2 Conclusion. Au début, mysql trie par la première colonne définie (avec GROUP BY). Et si dans la première colonne définie il y a des résultats égaux, alors uniquement dans les résultats égaux
triés
Concernant l' SUMutilisation avec GROUP BY. Si GROUP BYseulement par une colonne, alors SUMs toutes les valeurs de chaque distincte (différente) la valeur de la colonne sqlfiddle.com/#!9/1cbde2/2 . Si GROUP BYdeux colonnes. Ensuite, mysql vérifie d'abord si la première colonne contient des valeurs différentes dans la deuxième colonne. Si oui, alors mysql SUMchaque valeur différente de la deuxième colonne sqlfiddle.com/#!9/1cbde2/1 .
user2360831
23

Oui, mais que signifie le regroupement sur plus de deux colonnes? Eh bien, c'est la même chose que le regroupement par chaque paire unique par ligne. L'ordre dans lequel vous répertoriez les colonnes change la façon dont les lignes sont triées.

Dans votre exemple, vous écririez

GROUP BY fV.tier_id, f.form_template_id

Pendant ce temps, le code

GROUP BY f.form_template_id, fV.tier_id

donnerait des résultats similaires, mais triés différemment.

brandonCabi
la source
17
group by fV.tier_id, f.form_template_id
Trevor
la source
13

Pour utiliser un exemple simple, j'avais un compteur qui devait résumer les adresses IP uniques par page visitée sur un site. Qui est essentiellement regroupé par nom de page, puis par IP. Je l'ai résolu avec une combinaison de DISTINCT et GROUP BY.

SELECT pagename, COUNT(DISTINCT ipaddress) AS visit_count FROM log_visitors GROUP BY pagename ORDER BY visit_count DESC;
Daniklad
la source
2
Cette réponse mérite d'être notée, car elle résout un problème quelque peu différent des autres réponses.
ToolmakerSteve
5

Si vous préférez (je dois l'appliquer) grouper par deux colonnes en même temps, je viens de voir ce point:

SELECT CONCAT (col1, '_', col2) AS Group1 ... GROUP BY Group1
Lucas Andrade
la source
1
Voir les commentaires de ypercube sous la réponse de lada. Considérer comme une alternative: SELECT CONCAT(col1, '_', col2) FROM GROUP BY col1, col2. Les résultats seront généralement regarder les mêmes que cette réponse, mais l'exécution interne est tout à fait différente.
ToolmakerSteve
-2
GROUP BY CONCAT(col1, '_', col2)
lada
la source
37
Je me demande comment une réponse avec une seule ligne de code, publiée 4 ans après la réponse à la question, obtient 8 (huit!) Votes positifs. Tout en étant également incorrect et inefficace d'ailleurs tard et court.
ypercubeᵀᴹ
8
@ ypercubeᵀᴹ pourquoi dites-vous que c'est incorrect? C'est exactement ce que je cherchais, et une interprétation correcte de "regrouper par plusieurs colonnes". En fait, je ne sais pas pourquoi ce n'est pas le comportement de "group by col1, col2" comme je m'y attendais
Abram
3
@Abram vous cingle, vous voyez donc ma réponse à NeverEndingQueue. Inconvénients: c'est moins - beaucoup moins - efficace que GROUP BY col1, col2. Cela donnera de mauvais résultats avec certaines données. Dites col1, col2avoir des valeurs: ('a_b', 'c')dans une ligne et ('a', 'b_c')dans une autre. Cette mauvaise réponse, avec GROUP BY CONCAT, agrégera les deux lignes en une. La bonne réponse ne le sera pas.
ypercubeᵀᴹ
1
D'ailleurs, personne ne vous empêche d'utiliser l'expression CONCAT dans la liste SELECT si vous en avez besoin:SELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;
ypercubeᵀᴹ
1
@ ypercubeᵀᴹ oups, je pensais bêtement "group by foo, bar" se comportait comme "... group by foo union ... group by bar". Ce serait en effet un cas inhabituel pour GROUPE PAR CONCAT.
Abram