Énigme… order by

novembre 16, 2008

Cela part d’un problème tout simple,  trier les données d’une table:

mysql> SELECT id, technologie FROM enigme;
+------+-------------+
| id   | technologie |
+------+-------------+
|    1 | PHP         |
|    2 | LINUX       |
|    3 | MySQL       |
+------+-------------+

Pour trier les enregistrements en fonction de la technologie, faisons un ORDER BY sur la colonne technologie:

mysql> SELECT id, technologie FROM enigme ORDER BY technologie;
+------+-------------+
| id   | technologie |
+------+-------------+
|    1 | PHP         |
|    2 | LINUX       |
|    3 | MySQL       |
+------+-------------+

Il semble que le serveur n’a pas compris ce que je lui demande, ou alors je ne maitrise pas du tout l’alphabet..
Rajoutons la clause ASC (au cas où)

mysql> SELECT id, technologie FROM enigme ORDER BY technologie ASC;
+------+-------------+
| id   | technologie |
+------+-------------+
|    1 | PHP         |
|    2 | LINUX       |
|    3 | MySQL       |
+------+-------------+

Pas mieux !
eh ben mince alors !!!
MySQL ne veut décidement pas trier mes données comme je le souhaites. Et il devenu fou ? Dois-je changer de SGBDR ?

En fait un simple zoom sur la structure de la table nous permet de voir la chose d’un autre oeil, le bon !

mysql> SHOW CREATE TABLE enigme;
*************************** 1. row ************************
 Table: enigme
Create Table: CREATE TABLE `enigme` (
 `id` int(11) DEFAULT NULL,
 `technologie` enum('PHP','LINUX','MySQL') DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1

La colonne technologie est de type ENUM

Les données stockées disposent d’un index numérique utilisé par MySQL pour les manipuler. C’est également cet index qui est utilisé pour le tri. En d’autres termes, PHP vaut 1, LINUX vaut 2 et MySQL vaut 3, par conséquent le tri fonctionne correctement.

Alors comment faire pour avoir le résultat escompté ?

Il faut forcer MySQL à utiliser la valeur chaine de caractères et non l’index:

mysql> SELECT id, technologie FROM enigme ORDER BY concat(technologie);
+------+-------------+
| id   | technologie |
+------+-------------+
|    2 | LINUX       |
|    3 | MySQL       |
|    1 | PHP         |
+------+-------------+
  • la fonction cast()
mysql> SELECT id, technologie FROM enigme ORDER BY cast(technologie as char);
+------+-------------+
| id   | technologie |
+------+-------------+
|    2 | LINUX       |
|    3 | MySQL       |
|    1 | PHP         |
+------+-------------+

Comments are closed.