¿Es posible GRUPAR POR múltiples columnas usando MySQL?

206

¿Es posible GROUP BYmás de una columna en una SELECTconsulta MySQL ? Por ejemplo:

GROUP BY fV.tier_id AND 'f.form_template_id'
Pensamiento Rhys
fuente
3
No se puede agrupar por filas. Sin embargo
Joe Phillips el
¿Cuál es esta versión de sintaxis: stackoverflow.com/questions/2421388/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Es posible que necesite hacer una subconsulta en lugar de usar múltiples grupos por cláusulas.
Adam F
Si bien la mayoría de las respuestas con alto puntaje son esencialmente iguales entre sí (muestran la sintaxis correcta y explican el efecto de cambiar el orden de las dos columnas), si su necesidad es algo diferente, considere la respuesta de Daniklad .
ToolmakerSteve

Respuestas:

292
GROUP BY col1, col2, col3
Joe Phillips
fuente
107

Sí, puedes agrupar por múltiples columnas. Por ejemplo,

SELECT * FROM table
GROUP BY col1, col2

Los resultados primero se agruparán por col1, luego por col2. En MySQL, la preferencia de columna va de izquierda a derecha.

php
fuente
55
La preferencia de izquierda a derecha se aplica al orden ascendente de las agrupaciones y no a la preferencia de grupo de columnas. GROUP BYaplica col1+col2. Por ejemplo, col1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2ejecutar GROUP BY col1,col2volvería 1,1|1,3|2,2en lugar de 1,1|2,2lo sugerido. Mientras GROUP BY col2, col1que cambiaría el orden ascendente del retorno de col2. 1,1|2,2|1,3 Demostración: sqlfiddle.com/#!9/d5f69/1 Tenga en cuenta que el id de fila: 2 se devuelve en ambos casos a 2,2pesar de invertir las columnas.
fyrye
Una prueba más. sqlfiddle.com/#!9/5c8763/2 Conclusión. Al principio, mysql se ordena por la primera columna definida (con GROUP BY). Y si en la primera columna definida hay resultados iguales, entonces solo dentro de los resultados iguales se ordena por la segunda columna definida
usuario2360831
En cuanto a SUMusar con GROUP BY. Si GROUP BYsolo está en una columna, entonces SUMs todos los valores de cada distinto (diferente) el valor de la columna sqlfiddle.com/#!9/1cbde2/2 . Si GROUP BYdos columnas. Luego, mysql al principio verifica si para el valor de la primera columna hay valores diferentes en la segunda columna. En caso afirmativo, mysql SUMcada valor diferente de la segunda columna sqlfiddle.com/#!9/1cbde2/1 .
user2360831
23

Sí, pero ¿qué significa agrupar por más dos columnas? Bueno, es lo mismo que agrupar por cada par único por fila. El orden en que enumera las columnas cambia la forma en que se ordenan las filas.

En tu ejemplo, escribirías

GROUP BY fV.tier_id, f.form_template_id

Mientras tanto, el código

GROUP BY f.form_template_id, fV.tier_id

daría resultados similares, pero ordenados de manera diferente.

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

Para usar un ejemplo simple, tenía un contador que necesitaba resumir direcciones IP únicas por página visitada en un sitio. Que es básicamente agrupar por nombre de página y luego por IP. Lo resolví con una combinación de DISTINCT y GROUP BY.

SELECT pagename, COUNT(DISTINCT ipaddress) AS visit_count FROM log_visitors GROUP BY pagename ORDER BY visit_count DESC;
Daniklad
fuente
2
Vale la pena señalar esta respuesta, ya que resuelve un problema algo diferente a las otras respuestas.
ToolmakerSteve
5

Si prefiere (necesito aplicar esto) grupo por dos columnas al mismo tiempo, acabo de ver este punto:

SELECT CONCAT (col1, '_', col2) AS Group1 ... GROUP BY Group1
Lucas Andrade
fuente
1
Ver los comentarios de ypercube bajo la respuesta de lada. Considere como alternativa: SELECT CONCAT(col1, '_', col2) FROM GROUP BY col1, col2. Los resultados generalmente tendrán el mismo aspecto que esta respuesta, pero la ejecución interna es bastante diferente.
ToolmakerSteve
-2
GROUP BY CONCAT(col1, '_', col2)
lada
fuente
37
Me pregunto cómo una respuesta con solo una línea de código, publicada 4 años después de que se haya respondido la pregunta, obtiene 8 (¡ocho!) Votos a favor. Si bien también es incorrecto e ineficiente además de tarde y corto.
ypercubeᵀᴹ
8
@ ypercubeᵀᴹ ¿por qué dices que es incorrecto? Esto es exactamente lo que estaba buscando, y una interpretación correcta de "agrupar por múltiples columnas". De hecho, no sé por qué este no es el comportamiento de "agrupar por col1, col2" como esperaba
Abram
3
@Abram te hace ping, para que veas mi respuesta a NeverEndingQueue. Desventajas: es menos, mucho menos, eficiente que GROUP BY col1, col2. Dará resultados incorrectos con algunos datos. Digamos col1, col2tener valores: ('a_b', 'c')en una fila y ('a', 'b_c')en otra. Esta respuesta incorrecta, con GROUP BY CONCAT agregará las dos filas en una. La respuesta correcta no lo hará.
ypercubeᵀᴹ
1
Por cierto, nadie le impide usar la expresión CONCAT en la lista SELECT, si la necesita:SELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;
ypercubeᵀᴹ
1
@ ypercubeᵀᴹ Vaya, estúpidamente estaba pensando "grupo por tonto, bar" se comportó como "... grupo por tonto sindical ... grupo por bar". De hecho, sería un caso inusual para GROUP BY CONCAT.
Abram