Est-il possible de GROUP BY
plus d'une colonne dans une SELECT
requête MySQL ? Par exemple:
GROUP BY fV.tier_id AND 'f.form_template_id'
Est-il possible de GROUP BY
plus d'une colonne dans une SELECT
requête MySQL ? Par exemple:
GROUP BY fV.tier_id AND 'f.form_template_id'
Réponses:
GROUP BY col1, col2, col3
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.
GROUP BY
s'applique col1+col2
. par exemple, col1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2
et l'exécution GROUP BY col1,col2
reviendrait 1,1|1,3|2,2
par opposition à 1,1|2,2
comme suggéré. Alors GROUP BY col2, col1
que 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,2
malgré l'inversion des colonnes.
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
SUM
utilisation avec GROUP BY
. Si GROUP BY
seulement par une colonne, alors SUM
s toutes les valeurs de chaque distincte (différente) la valeur de la colonne sqlfiddle.com/#!9/1cbde2/2 . Si GROUP BY
deux 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 SUM
chaque valeur différente de la deuxième colonne sqlfiddle.com/#!9/1cbde2/1 .
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.
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;
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
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.
GROUP BY CONCAT(col1, '_', col2)
GROUP BY col1, col2
. Cela donnera de mauvais résultats avec certaines données. Dites col1, col2
avoir 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.
SELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;