Il peut arriver qu’un ordre spécifique soit nécessaire dans une requête SQL, ce qui ne peut pas être fait en utilisant ASC ou DESC ou en utilisant un champ de tri spécial. MySQL dispose d’une fonction ORDER BY FIELD qui peut être utilisée à cet effet.

Données d’exemple

Les données d’exemple de ce post utilisent ma table de fruits d’exemple. Il s’agit d’une table quelque peu simple, mais elle peut être utilisée pour illustrer assez bien le point de ce post.

Commandes par valeurs de champs spécifiques

La table des fruits a un champ « nom » avec les valeurs uniques suivantes : Pomme, Banane, Orange, Poire. Chacune de ces valeurs uniques a un ensemble de variétés.

Disons, pour l’argument, que nous voulons ordonner les données dans un ordre spécifique par Banane, Pomme, Poire, Orange et ensuite par leurs variétés. Il n’est pas possible de le faire en utilisant une clause ORDER BY ordinaire, car un tri ascendant ou descendant sur ce champ ne fonctionnera pas. Nous aurions besoin d’une forme de colonne de tri ou d’une autre alternative.

En utilisant la fonction FIELD( ) dans la clause ORDER BY, nous pouvons réaliser cela. Elle fonctionne en spécifiant la colonne à trier et ensuite les valeurs à trier dans l’ordre. Par exemple:

SELECT * FROM fruit ORDER BY FIELD(name, 'Banana', 'Apple', 'Pear', 'Orange'), variety;

Les données résultantes de la table d’exemple ressemblent à ceci:

+----------+--------+---------------------+| fruit_id | name | variety |+----------+--------+---------------------+| 11 | Banana | Burro || 12 | Banana | Cavendish || 10 | Banana | Plantain || 6 | Apple | Cox's Orange Pippin || 7 | Apple | Granny Smith || 1 | Apple | Red Delicious || 8 | Pear | Anjou || 4 | Pear | Bartlett || 2 | Pear | Comice || 5 | Orange | Blood || 3 | Orange | Navel || 9 | Orange | Valencia |+----------+--------+---------------------+

L’écueil

Il y a un léger « écueil » lors de l’utilisation de cette fonction. Toutes les valeurs présentes dans la colonne qui ne sont pas dans la fonction FIELD() apparaîtront dans un ordre plus ou moins aléatoire avant les valeurs spécifiées. Par exemple, en ne spécifiant que Pomme et Banane :

SELECT * FROM fruit ORDER BY FIELD(name, 'Banana', 'Apple') DESC, variety;

Ceci donne :

+----------+--------+---------------------+| fruit_id | name | variety |+----------+--------+---------------------+| 6 | Apple | Cox's Orange Pippin || 7 | Apple | Granny Smith || 1 | Apple | Red Delicious || 11 | Banana | Burro || 12 | Banana | Cavendish || 10 | Banana | Plantain || 8 | Pear | Anjou || 4 | Pear | Bartlett || 5 | Orange | Blood || 2 | Pear | Comice || 3 | Orange | Navel || 9 | Orange | Valencia |+----------+--------+---------------------+

Une solution au gotcha

Bien que vous n’utilisiez normalement cette fonction que lorsque les colonnes exactes sont connues, une solution consiste à inverser l’ordre des champs spécifiés et à les classer dans un ordre décroissant, puis à effectuer un second tri sur le même champ.

L’exemple suivant, malgré son apparence, trie en fait dans l’ordre Banana, puis Apple, puis les autres noms dans l’ordre croissant :

SELECT * FROM fruit ORDER BY FIELD(name, 'Apple', 'Banana') DESC, name, variety;

Ceci donne :

+----------+--------+---------------------+| fruit_id | name | variety |+----------+--------+---------------------+| 11 | Banana | Burro || 12 | Banana | Cavendish || 10 | Banana | Plantain || 6 | Apple | Cox's Orange Pippin || 7 | Apple | Granny Smith || 1 | Apple | Red Delicious || 5 | Orange | Blood || 3 | Orange | Navel || 9 | Orange | Valencia || 8 | Pear | Anjou || 4 | Pear | Bartlett || 2 | Pear | Comice |+----------+--------+---------------------+

Cela peut être une solution utile si un ensemble spécifique de lignes doit apparaître avant les autres dans le jeu de résultats, mais il n’apparaîtrait normalement pas en premier lorsqu’on utilise un ordre de tri ASC ou DESC.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.