É possível agrupar por várias colunas usando o MySQL?

206

É possível GROUP BYmais de uma coluna em uma SELECTconsulta MySQL ? Por exemplo:

GROUP BY fV.tier_id AND 'f.form_template_id'
Pensamento de Rhys
fonte
3
Você não pode agrupar por linhas. Você pode agrupar por colunas embora
Joe Phillips
O que é esta versão de sintaxe: stackoverflow.com/questions/2421388/…
Ciro Santilli </
1
Pode ser necessário fazer uma subconsulta em vez de usar vários grupos por cláusulas.
Adam F
Embora a maioria das respostas mais votadas sejam essencialmente as mesmas (elas mostram a sintaxe correta e explicam o efeito de mudar a ordem das duas colunas), se a sua necessidade for um pouco diferente, considere a resposta de Daniklad .
Home

Respostas:

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

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.

php
fonte
5
A preferência da esquerda para a direita é aplicada à ordem crescente dos agrupamentos e não à preferência do grupo de colunas. GROUP BYaplica-se col1+col2. por exemplo, col1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2e a execução GROUP BY col1,col2retornaria 1,1|1,3|2,2ao contrário do 1,1|2,2sugerido. Considerando GROUP BY col2, col1que 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,2apesar da inversão das colunas.
Fyrye 24/05
Mais um teste. sqlfiddle.com/#!9/5c8763/2 Conclusão. No início, o mysql classifica pela primeira coluna definida (com GROUP BY). E se na primeira coluna definido há resultados iguais, então somente dentro dos resultados tipos iguais pela segunda coluna definida
user2360831
Em relação ao SUMuso com GROUP BY. Se GROUP BYapenas por uma coluna, SUMs 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 SUMcada valor diferente da segunda coluna sqlfiddle.com/#!9/1cbde2/1 .
user2360831
23

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.

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

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;
Daniklad
fonte
2
Vale a pena notar essa resposta, pois resolve um problema um pouco diferente das outras respostas.
Home
5

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
Lucas Andrade
fonte
1
Veja os comentários de ypercube na resposta de lada. Considere como uma alternativa: 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.
Home
-2
GROUP BY CONCAT(col1, '_', col2)
lada
fonte
37
Eu me pergunto como uma resposta com apenas uma linha de código, postada 4 anos após a pergunta ter sido respondida, recebe 8 (oito!) Votos positivos. Além de incorreto e ineficiente, além de tardio e curto.
ypercubeᵀᴹ
8
@ ypercubeᵀᴹ por que você diz que está incorreto? Era exatamente isso que eu procurava e uma interpretação correta de "agrupar por várias colunas". Na verdade, eu não sei por que isso não é o comportamento de "grupo por col1, col2" como eu esperaria
Abram
3
@ Abram pingando você, para que você veja minha resposta para NeverEndingQueue. Desvantagens: é menos - muito menos - eficiente que GROUP BY col1, col2. Isso dará resultados errados com alguns dados. Digamos col1, col2ter 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á.
ypercubeᵀᴹ
1
Ninguém o impede de usar a expressão CONCAT na lista SELECT, a propósito, se você precisar:SELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;
ypercubeᵀᴹ 17/17/17
1
@ ypercubeᵀᴹ opa, estupidamente eu estava pensando "grupo por foo, bar" se comportou como "... grupo por foo union ... grupo por bar". Seria um caso incomum de fato GROUP BY CONCAT.
Abram