Ordre avec opérateur IN dans MySQL

Publié le 23 octobre 2014 par Rhw @RevueHW

Quand vous avez à faire plusieurs requête avec différents ID à la même table dans MySQL, l’utilisation de l'opérateur IN vous sera très utile. Si vous aviez une liste d'ID que vous voulez obtenir les données, au lieu de faire des requêtes multiples à la même table on peut combiner ceux-ci dans une seule requête en utilisant IN.

SELECT * FROM foo f where f.id IN (1, 2, 3);

Ceci renvoie un recordset de ces rangées comme les suivantes.

+----+-------+
| id | nom |
+----+-------+
| 1 | un |
| 2 | deux |
| 3 | trois |
+----+-------+
3 rangs dans la série (0.00 sec)

Mais le problème avec cette requête est que l'ordre avec lequel vous passez  ces ID dans la déclaration IN ne fait aucune différence à la façon dont il est retourné. Si j'avais une liste d'ID 2, 3, 1 et je voulais obtenir les données de ces ID, je peux utiliser la déclaration IN pour obtenir ces données.

SELECT * FROM foo f where f.id IN (2, 3, 1);

Le recordset retourné va utiliser la clé primaire pour ordonner les données. On obtiendra alors exactement la même chose qu’avec la première requête. Toutefois, je veux que le recordset soit organiser avec le même ordre que j’ai spécifié dans ma requête.

+----+--------+
| id | nom |
+----+--------+
| 2 | deux |
| 3 | trois |
| 1 | un |
+----+--------+
3 rangs in set (0.00 sec)

Afin de maintenir l'ordre de la déclaration IN, je dois définir l'ordre de mon choix à l'aide de la déclaration ORDER BY FIELD(), ce qui me permet de spécifier le champ et les valeurs que je veux qu'ils soient retournée. 

SELECT * FROM foo f where f.id IN (2, 3, 1) ORDER BY FIELD(f.id, 2, 3, 1);