É possível GROUP BY
mais de uma coluna em uma SELECT
consulta MySQL ? Por exemplo:
GROUP BY fV.tier_id AND 'f.form_template_id'
É possível GROUP BY
mais de uma coluna em uma SELECT
consulta MySQL ? Por exemplo:
GROUP BY fV.tier_id AND 'f.form_template_id'
Respostas:
GROUP BY col1, col2, col3
Sim, você pode agrupar por várias colunas. Por exemplo,
SELECT * FROM table
GROUP BY col1, col2
Os resultados serão primeiro agrupados por col1 e depois por col2. No MySQL, a preferência da coluna vai da esquerda para a direita.
GROUP BY
aplica-se col1+col2
. por exemplo, col1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2
e a execução GROUP BY col1,col2
retornaria 1,1|1,3|2,2
ao contrário do 1,1|2,2
sugerido. Considerando GROUP BY col2, col1
que mudaria a ordem crescente de retorno col2. 1,1|2,2|1,3
Demo: sqlfiddle.com/#!9/d5f69/1 Observe que o ID da linha: 2 é retornado nos dois casos, 2,2
apesar da inversão das colunas.
GROUP BY
). E se na primeira coluna definido há resultados iguais, então somente dentro dos resultados tipos iguais pela segunda coluna definida
SUM
uso com GROUP BY
. Se GROUP BY
apenas por uma coluna, SUM
s todos os valores de cada distinto (diferente) o valor da coluna sqlfiddle.com/#!9/1cbde2/2 . E seGROUP BY
duas colunas. Então o mysql primeiro verifica se o valor da primeira coluna possui valores diferentes na segunda coluna. Se sim, então mysql SUM
cada valor diferente da segunda coluna sqlfiddle.com/#!9/1cbde2/1 .
Sim, mas o que significa agrupar por mais duas colunas? Bem, é o mesmo que agrupar por cada par único por linha. A ordem em que você lista as colunas altera a maneira como as linhas são classificadas.
No seu exemplo, você escreveria
GROUP BY fV.tier_id, f.form_template_id
Enquanto isso, o código
GROUP BY f.form_template_id, fV.tier_id
daria resultados semelhantes, mas classificados de maneira diferente.
Para usar um exemplo simples, eu tinha um contador que precisava resumir endereços IP exclusivos por página visitada em um site. Que é basicamente agrupar por nome da página e depois por IP. Eu o resolvi com uma combinação de DISTINCT e GROUP BY.
SELECT pagename, COUNT(DISTINCT ipaddress) AS visit_count FROM log_visitors GROUP BY pagename ORDER BY visit_count DESC;
Se você preferir (eu preciso aplicar isso) agrupar por duas colunas ao mesmo tempo, acabei de ver este ponto:
SELECT CONCAT (col1, '_', col2) AS Group1 ... GROUP BY Group1
SELECT CONCAT(col1, '_', col2) FROM GROUP BY col1, col2
. Os resultados geralmente vai olhar o mesmo que esta resposta, mas a execução interna é bem diferente.
GROUP BY CONCAT(col1, '_', col2)
GROUP BY col1, col2
. Isso dará resultados errados com alguns dados. Digamos col1, col2
ter valores: ('a_b', 'c')
em uma linha e ('a', 'b_c')
em outra. Esta resposta errada, com GROUP BY CONCAT, agregará as duas linhas em uma. A resposta correta não será.
SELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;