2009-12-03 30 views
110

¿Es posible GROUP BY más de una columna en una consulta MySQL SELECT? Por ejemplo:¿Es posible agrupar varias columnas mediante MySQL?

GROUP BY fV.tier_id AND 'f.form_template_id' 
+3

No se puede agrupar por filas. Puede agrupar por columnas en –

+12

Por el bien de SEO: mi primera búsqueda fue para "múltiples' GROUP BY' MySQL ". –

+8

Eso no es para SEO, eso es para los usuarios. – Buffalo

Respuesta

171
GROUP BY col1, col2, col3 
12
group by fV.tier_id, f.form_template_id 
2
GROUP BY CONCAT(col1, '_', col2) 
+21

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 hacia arriba. Aunque también es incorrecto e ineficiente además de tarde y corto. –

+3

Incluso una ardilla ciega obtiene una nuez de vez en cuando ... – thebarless

+5

@ ypercubeᵀᴹ ¿por qué dices que es incorrecta? Esto es exactamente lo que estaba buscando, y una correcta interpretación de "grupo por columnas múltiples". De hecho, no sé por qué este no es el comportamiento de "group by col1, col2" como esperaba – Abram

49

Sí se puede agrupar por varias columnas. Pero no puedes obtener la respuesta correcta.

select * from table group by col1, col2 

Cuando,
        col1 tiene primera preferencia a agruparse y col2 consiguió segunda preferencia. Porque el mysql da preferencia de izquierda a derecha.

+1

La preferencia de izquierda a derecha se aplica al orden ascendente de las agrupaciones y no a la preferencia del grupo de columnas. 'GROUP BY' aplica' col1 + col2'. p.ej. 'col1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2' y ejecutar 'GROUP BY col1, col2' devolvería' 1,1 | 1,3 | 2,2' en lugar de '1,1 | 2,2' como se sugiere. Mientras que 'GROUP BY col2, col1' cambiaría el orden ascendente de col2 que regresaba. '1,1 | 2,2 | 1,3' Demo: http://sqlfiddle.com/#!9/d5f69/1 Tenga en cuenta que row id: 2 se devuelve en ambos casos para' 2,2' a pesar de invertir el columnas – fyrye

+0

Sí, Mysql nos dio un resultado incorrecto –

12

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 se enumeran las columnas cambia la forma en que se ordenan las filas.

En su ejemplo, podría escribir

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.

2

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; 
0

Si prefiere (necesito para aplicar este) grupo por dos columnas en la misma hora, acabo de ver este punto:

SELECT CONCAT (col1, '_', col2) AS Group1 ... GROUP BY Group1 
Cuestiones relacionadas