57 votes

MySQL Select WHERE IN ordre donné

J'ai quelque chose comme

SELECT * FROM table WHERE id IN (118,17,113,23,72);

Si je fais cela, les lignes sont renvoyées dans l'ordre croissant des identifiants. Existe-t-il un moyen de récupérer les lignes dans l'ordre indiqué dans l'instruction IN ?

106voto

nico Points 21115

Vous devez utiliser "ORDER BY CHAMP ". Ainsi, par exemple :

SELECT * FROM table WHERE id IN (118,17,113,23,72) 
ORDER BY FIELD(id,118,17,113,23,72)

0 votes

@kentor : pas de problème, content que ça ait aidé.

1 votes

Qu'en est-il des performances ? Est-il lent de spécifier à nouveau la même liste d'identifiants ?

15voto

Brian Points 7157

Essayez d'utiliser FIND_IN_SET :

SELECT * FROM table WHERE id IN (118,17,113,23,72) 
    ORDER BY FIND_IN_SET(id, '118,17,113,23,72');

3 votes

Comment find_in_set comparer à field ?

2 votes

@ShiningRay Du manuel semble que le FIELD est une méthode simple et FIND_IN_SET est plus puissant et plus complexe, car il implique l'analyse des chaînes de caractères et l'utilisation de la fonction SET création.

1 votes

La réponse principale ne fonctionne pas pour moi, mais cette réponse fonctionne. Merci

2voto

egrunin Points 15356

Vous pouvez créer une table temporaire avec deux colonnes (ID, order_num) :

ID   order_num
118  1
17   2
113  3
23   4
72   5

Alors, rejoignez-nous :

SELECT * from table
INNER JOIN #temp_table 
ON table.id = #temp_table.id

Remarquez que vous pouvez laisser tomber le IN clause.

Parfois, je crée une table permanente, parce que lorsque le client inévitablement change d'avis sur la commande, je n'ai pas à toucher au code, juste au tableau.

Editar

La réponse utilisant ORDER BY FIELD() (que je ne connaissais pas) est probablement ce que vous voulez.

0voto

David Espart Points 3608

Une option consiste à utiliser UNION :

SELECT * FROM table WHERE id = 118
UNION
SELECT * FROM table WHERE id = 17
UNION
SELECT * FROM table WHERE id = 113
...

0 votes

Ou UNION ALL si vous récupérez des rangées qui pourraient être des doublons les unes des autres. Dans mon code, il semble que cela puisse être assez lent.

0voto

Guffa Points 308133

Vous pouvez créer un nombre à trier en fonction des valeurs d'identification :

select *
from table
where id in (118,17,113,23,72)
order by
  case id
    when 118 then 1
    when 17 then 2
    when 133 then 3
    when 23 then 4
    when 72 then 5
  end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X