Problema:
Hai aggregato i dati in gruppi, ma desideri ordinare i record in ordine decrescente in base al numero di elementi nei gruppi.
Esempio:
Il nostro database ha una tabella denominata user con i dati nelle seguenti colonne:id , first_name , last_name e country .
| id | nome | cognome | paese |
|---|---|---|---|
| 1 | Lisa | Williams | Inghilterra |
| 2 | Gary | Anders | Polonia |
| 3 | Tom | Williams | Polonia |
| 4 | Michele | Marrone | Francia |
| 5 | Susana | Fabio | Stati Uniti |
| 6 | Anna | Jones | Stati Uniti |
| 7 | Elli | Mugnaio | Polonia |
Creiamo un report sui nostri utenti. Raggrupperemo i risultati per country e contare il numero di utenti di ogni paese. Ma ordineremo anche i gruppi in ordine decrescente in base al numero di utenti. In questo modo, i paesi con il maggior numero di utenti verranno visualizzati in alto.
Soluzione:
SELECT country, COUNT(id) FROM user GROUP BY country ORDER BY COUNT(id) DESC ;
| paese | count(id) |
|---|---|
| Polonia | 3 |
| USA | 2 |
| Inghilterra | 1 |
| Francia | 1 |
Discussione:
Per ordinare i record selezionati in base al numero degli elementi in ciascun gruppo, utilizzare il ORDER BY clausola.
Il primo passo è usare il GROUP BY clausola per creare i gruppi (nel nostro esempio, raggruppiamo per country colonna). Quindi, nella clausola ORDER BY, utilizzi la funzione di aggregazione COUNT, che conta il numero di valori nella colonna di tua scelta; nel nostro esempio, contiamo ID distinti con COUNT(id) . Questo conta effettivamente il numero di elementi in ciascun gruppo. Il ORDER BY La clausola quindi ordina i gruppi in base a tale calcolo.
Come al solito, puoi utilizzare sia l'ordine crescente che quello decrescente con ORDER BY . Se vuoi un ordine decrescente (come in questo esempio), usa il DESC parola chiave. L'ordine crescente non richiede alcuna parola chiave perché è l'impostazione predefinita, ma puoi utilizzare l'ASC parola chiave se vuoi essere esplicito. Questo è lo stesso esempio ma con i risultati ordinati in ordine crescente:
Soluzione:
SELECT country, COUNT(id) FROM user GROUP BY country ORDER BY COUNT(id);
Ecco il risultato:
| paese | count(id) |
|---|---|
| Inghilterra | 1 |
| Francia | 1 |
| USA | 2 |
| Polonia | 3 |