Tag Archives: mysql

GROUP BY qui respecte l’ordre numérique Avec MySQL

Triez un champ avec un tri numérique et non sur les codes des caractères en MySQL. Il est parfois utile de trier une liste d’enregistrement grâce à un champ. Si ce champ contient des chiffres mais qu’il est défini comme un varchar. La fonction ORDER BY fera un mauvais tri. Cas classique et idéal: Type: Integer(11) Data:

+———-+
| Nombres |
+———-+
| 10 |
| 500 |
| 1 |
| 3000 |
| 20 |
| 50 |
| 30 |
| 1000 |
+———-+

Requête nomale.
Requête: SELECT numbers from table order by numbers
Nous obtenons ce résultat:

+———-+
| Nombres |
+———-+
| 1 |
| 10 |
| 20 |
| 30 |
| 50 |
| 500 |
| 1000 |
| 3000 |
+———-+

Le tri est fait de façon correcte. Si nous changeons le type de la donnée en texte, et que nous trions à nouveau.
Requête: SELECT left(numbers, 11) as numbersSTR from table order by numbersSTR
Nous obtenons ce résultat:

+————+
| NombresSTR |
+————+
| 1 |
| 10 |
| 1000 |
| 20 |
| 30 |
| 3000 |
| 50 |
| 500 |
+————+

Ce résultat ne suit pas l’ordre mathématique des nombres. Dans le même ordre d’idée, si vous avez des nombres stockés dans une champ text ou varchar, et que vous souhaitez les trier dans l’ordre croissant. Ce résultat sera surement mauvais.
Requête: select number from (table) order by number;

+——–+
| Nombre |
+——–+
| 1 |
| 10 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+——–+

Pour palier ce problème, vous pouvez utiliser cette astuce.
Requête: select number from (table) order by (number+0);

+——–+
| Nombre |
+——–+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
+——–+

Le résultat est celui attendu. (champ + 0 ) convertit le texte/le caractère en nombre. Ainsi le tri est fait correctement.