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 .
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.
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.
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.
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.
Respuestas:
fuente
Sí, puedes agrupar por múltiples columnas. Por ejemplo,
Los resultados primero se agruparán por col1, luego por col2. En MySQL, la preferencia de columna va de izquierda a derecha.
fuente
GROUP BY
aplicacol1+col2
. Por ejemplo,col1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2
ejecutarGROUP BY col1,col2
volvería1,1|1,3|2,2
en lugar de1,1|2,2
lo sugerido. MientrasGROUP BY col2, col1
que 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 a2,2
pesar de invertir las columnas.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 definidaSUM
usar conGROUP BY
. SiGROUP BY
solo está en una columna, entoncesSUM
s todos los valores de cada distinto (diferente) el valor de la columna sqlfiddle.com/#!9/1cbde2/2 . SiGROUP BY
dos columnas. Luego, mysql al principio verifica si para el valor de la primera columna hay valores diferentes en la segunda columna. En caso afirmativo, mysqlSUM
cada valor diferente de la segunda columna sqlfiddle.com/#!9/1cbde2/1 .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.
fuente
fuente
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.
fuente
Si prefiere (necesito aplicar esto) grupo por dos columnas al mismo tiempo, acabo de ver este punto:
fuente
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.fuente
GROUP BY col1, col2
. Dará resultados incorrectos con algunos datos. Digamoscol1, col2
tener 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á.SELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;