È possibile raggruppare più colonne utilizzando MySQL?


206

È possibile GROUP BYpiù di una colonna in una SELECTquery MySQL ? Per esempio:

GROUP BY fV.tier_id AND 'f.form_template_id'

3
Non puoi raggruppare per righe. Puoi raggruppare per colonne
Joe Phillips,


1
Potrebbe essere necessario eseguire una sottoquery invece di utilizzare più clausole group by.
Adam F,

Mentre la maggior parte delle risposte più votate sono essenzialmente le stesse l'una dell'altra (mostrano la sintassi corretta e spiegano l'effetto di cambiare l'ordine delle due colonne), se il tuo bisogno è leggermente diverso, considera la risposta di Daniklad .
ToolmakerSteve

Risposte:



107

Sì, puoi raggruppare per più colonne. Per esempio,

SELECT * FROM table
GROUP BY col1, col2

I risultati verranno prima raggruppati per col1, quindi per col2. In MySQL, la preferenza di colonna va da sinistra a destra.


5
La preferenza da sinistra a destra viene applicata all'ordine crescente dei raggruppamenti e non alla preferenza del gruppo di colonne. GROUP BYsi applica col1+col2. ad es. col1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2e la corsa GROUP BY col1,col2ritornerebbe 1,1|1,3|2,2al contrario di 1,1|2,2quanto suggerito. Considerando GROUP BY col2, col1che cambierebbe l'ordine crescente di ritorno col2. 1,1|2,2|1,3 Demo: sqlfiddle.com/#!9/d5f69/1 Nota che l'id riga: 2 viene restituito in entrambi i casi, 2,2nonostante abbia invertito le colonne.
fyrye,

Un altro test. sqlfiddle.com/#!9/5c8763/2 Conclusione. All'inizio mysql ordina per la prima colonna definita (con GROUP BY). E se nella prima colonna definita ci sono risultati uguali, allora solo all'interno degli stessi risultati ordina per la seconda colonna definita
user2360831

Per quanto riguarda l' SUMutilizzo con GROUP BY. Se GROUP BYsolo per una colonna, allora SUMs tutti i valori di ogni distinto (diverso) il valore della colonna sqlfiddle.com/#!9/1cbde2/2 . Se GROUP BYdue colonne. Quindi mysql all'inizio controlla se per il valore della prima colonna ci sono valori diversi nella seconda colonna. Se sì, allora mysql SUMogni diverso valore della seconda colonna sqlfiddle.com/#!9/1cbde2/1 .
user2360831

23

Sì, ma cosa significa raggruppare per più due colonne? Bene, è lo stesso del raggruppamento per ciascuna coppia unica per riga. L'ordine in cui vengono elencate le colonne cambia il modo in cui le righe vengono ordinate.

Nel tuo esempio, scriveresti

GROUP BY fV.tier_id, f.form_template_id

Nel frattempo, il codice

GROUP BY f.form_template_id, fV.tier_id

darebbe risultati simili, ma ordinati in modo diverso.



13

Per usare un semplice esempio, avevo un contatore che doveva riassumere indirizzi IP univoci per pagina visitata su un sito. Che è fondamentalmente raggruppando per nome pagina e quindi per IP. L'ho risolto con una combinazione di DISTINCT e GROUP BY.

SELECT pagename, COUNT(DISTINCT ipaddress) AS visit_count FROM log_visitors GROUP BY pagename ORDER BY visit_count DESC;

2
Vale la pena notare questa risposta, poiché risolve un problema leggermente diverso rispetto alle altre risposte.
ToolmakerSteve

5

Se preferisci (devo applicare questo) gruppo di due colonne contemporaneamente, ho appena visto questo punto:

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

1
Vedi i commenti di ypercube sotto la risposta di lada. Prendere in considerazione come alternativa: SELECT CONCAT(col1, '_', col2) FROM GROUP BY col1, col2. I risultati di solito guardano la stessa di questa risposta, ma l'esecuzione interna è molto diversa.
ToolmakerSteve

-2
GROUP BY CONCAT(col1, '_', col2)

37
Mi chiedo come una risposta con una sola riga di codice, pubblicata 4 anni dopo la risposta alla domanda, ottenga 8 (otto!) Voti. Pur essendo errato e inefficiente oltre a ritardo e breve.
ypercubeᵀᴹ

8
@ ypercubeᵀᴹ perché dici che non è corretto? Questo è esattamente quello che stavo cercando, e una corretta interpretazione di "raggruppa per più colonne". In realtà, non so perché questo non sia il comportamento di "gruppo per col1, col2" come mi aspetterei
Abram,

3
@Abram ti sta eseguendo il ping, quindi vedi la mia risposta a NeverEndingQueue. Lati negativi: è meno - molto meno - efficiente di GROUP BY col1, col2. Fornirà risultati errati con alcuni dati. Dire col1, col2avere valori: ('a_b', 'c')in una riga e ('a', 'b_c')in un'altra. Questa risposta errata, con GROUP BY CONCAT aggregherà le due righe in una. La risposta corretta no.
ypercubeᵀᴹ

1
Nessuno ti impedisce di usare l'espressione CONCAT nell'elenco SELECT, se ne hai bisogno:SELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;
ypercubeᵀᴹ

1
@ ypercubeᵀᴹ oops, stupidamente stavo pensando "raggruppa per foo, bar" si comportava come "... raggruppa per foo union ... raggruppa per bar". Sarebbe davvero un caso insolito per GROUP BY CONCAT.
Abram,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.