È possibile GROUP BY
più di una colonna in una SELECT
query MySQL ? Per esempio:
GROUP BY fV.tier_id AND 'f.form_template_id'
È possibile GROUP BY
più di una colonna in una SELECT
query MySQL ? Per esempio:
GROUP BY fV.tier_id AND 'f.form_template_id'
Risposte:
GROUP BY col1, col2, col3
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.
GROUP BY
si applica col1+col2
. ad es. col1 = 1, 2, 1, 2 | col2 = 1, 2, 3, 2
e la corsa GROUP BY col1,col2
ritornerebbe 1,1|1,3|2,2
al contrario di 1,1|2,2
quanto suggerito. Considerando GROUP BY col2, col1
che 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,2
nonostante abbia invertito le colonne.
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
SUM
utilizzo con GROUP BY
. Se GROUP BY
solo per una colonna, allora SUM
s tutti i valori di ogni distinto (diverso) il valore della colonna sqlfiddle.com/#!9/1cbde2/2 . Se GROUP BY
due colonne. Quindi mysql all'inizio controlla se per il valore della prima colonna ci sono valori diversi nella seconda colonna. Se sì, allora mysql SUM
ogni diverso valore della seconda colonna sqlfiddle.com/#!9/1cbde2/1 .
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.
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;
Se preferisci (devo applicare questo) gruppo di due colonne contemporaneamente, ho appena visto questo punto:
SELECT CONCAT (col1, '_', col2) AS Group1 ... GROUP BY Group1
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.
GROUP BY CONCAT(col1, '_', col2)
GROUP BY col1, col2
. Fornirà risultati errati con alcuni dati. Dire col1, col2
avere 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.
SELECT CONCAT(col1, '_', col2) ... FROM ... GROUP BY col1, col2 ;