Problème :
Vous avez regroupé des données dans des groupes, mais vous souhaitez trier les enregistrements par ordre décroissant en fonction du nombre d'éléments dans les groupes.
Exemple :
Notre base de données a une table nommée user avec des données dans les colonnes suivantes :id , first_name , last_name , et country .
| identifiant | prénom | nom_de_famille | pays |
|---|---|---|---|
| 1 | Lisa | Williams | Angleterre |
| 2 | Gary | Anders | Pologne |
| 3 | Tom | Williams | Pologne |
| 4 | Michel | Marron | France |
| 5 | Susan | Smith | États-Unis |
| 6 | Anne | Jones | États-Unis |
| 7 | Élie | Miller | Pologne |
Créons un rapport sur nos utilisateurs. Nous regrouperons les résultats par country et compter le nombre d'utilisateurs de chaque pays. Mais nous allons également trier les groupes par ordre décroissant du nombre d'utilisateurs. De cette façon, les pays avec le plus grand nombre d'utilisateurs apparaîtront en haut.
Solution :
SELECT country, COUNT(id) FROM user GROUP BY country ORDER BY COUNT(id) DESC ;
| pays | count(id) |
|---|---|
| Pologne | 3 |
| États-Unis | 2 |
| Angleterre | 1 |
| France | 1 |
Discussion :
Pour trier les enregistrements sélectionnés par le nombre d'éléments dans chaque groupe, vous utilisez le ORDER BY clause.
La première étape consiste à utiliser le GROUP BY clause pour créer les groupes (dans notre exemple, nous regroupons par le country colonne). Ensuite, dans la clause ORDER BY, vous utilisez la fonction d'agrégation COUNT, qui compte le nombre de valeurs dans la colonne de votre choix; dans notre exemple, nous comptons les identifiants distincts avec COUNT(id) . Cela compte effectivement le nombre d'éléments dans chaque groupe. Le ORDER BY clause trie ensuite les groupes en fonction de ce calcul.
Comme d'habitude, vous pouvez utiliser l'ordre croissant ou décroissant avec ORDER BY . Si vous voulez un ordre décroissant (comme dans cet exemple), vous utilisez le DESC mot-clé. L'ordre croissant n'a pas besoin de mot-clé car c'est la valeur par défaut, mais vous pouvez utiliser le ASC mot-clé si vous voulez être explicite. C'est le même exemple mais avec les résultats triés par ordre croissant :
Solution :
SELECT country, COUNT(id) FROM user GROUP BY country ORDER BY COUNT(id);
Voici le résultat :
| pays | count(id) |
|---|---|
| Angleterre | 1 |
| France | 1 |
| États-Unis | 2 |
| Pologne | 3 |