¿Es posible GROUP BY
más de una columna en una SELECT
consulta MySQL ? Por ejemplo:
GROUP BY fV.tier_id AND 'f.form_template_id'
¿Es posible GROUP BY
más de una columna en una SELECT
consulta MySQL ? Por ejemplo:
GROUP BY fV.tier_id AND 'f.form_template_id'
Respuestas:
GROUP BY col1, col2, col3
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.
GROUP BY
aplica col1+col2
. Por ejemplo, col1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2
ejecutar GROUP BY col1,col2
volvería 1,1|1,3|2,2
en lugar de 1,1|2,2
lo sugerido. Mientras GROUP 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 a 2,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 definida
SUM
usar con GROUP BY
. Si GROUP BY
solo está en una columna, entonces SUM
s todos los valores de cada distinto (diferente) el valor de la columna sqlfiddle.com/#!9/1cbde2/2 . Si GROUP 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, mysql SUM
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.
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;
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
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.
GROUP BY CONCAT(col1, '_', col2)
GROUP BY col1, col2
. Dará resultados incorrectos con algunos datos. Digamos col1, 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 ;