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 .
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.
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.
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.
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.
Respostas:
fonte
Sim, você pode agrupar por várias colunas. Por exemplo,
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.
fonte
GROUP BY
aplica-secol1+col2
. por exemplo,col1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2
e a execuçãoGROUP BY col1,col2
retornaria1,1|1,3|2,2
ao contrário do1,1|2,2
sugerido. ConsiderandoGROUP 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 definidaSUM
uso comGROUP BY
. SeGROUP 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 mysqlSUM
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.
fonte
fonte
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.
fonte
Se você preferir (eu preciso aplicar isso) agrupar por duas colunas ao mesmo tempo, acabei de ver este ponto:
fonte
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.fonte
GROUP BY col1, col2
. Isso dará resultados errados com alguns dados. Digamoscol1, 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 ;