2010-09-26 5 views
41

J'ai quelque chose commeMySQL Sélectionnez OÙ donné l'ordre

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

Si je fais juste cela, il renvoie les lignes dans l'ordre croissant ID. Y a-t-il un moyen de récupérer les lignes dans l'ordre indiqué dans l'instruction IN?

Répondre

77

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

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

Merci! Cela marche! – kentor

+0

@kentor: pas de problème, contente que ça ait aidé – nico

+1

Comment va la performance? Est-il lent lorsque vous spécifiez la même liste d'ID? – Emerald214

11

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'); 
+0

+1: Cela allait être ma recommandation –

+3

Comment '' find_in_set' comparer à field'? – ShiningRay

+2

@ShiningRay Du manuel semble que le 'FIELD' est une méthode simple et' FIND_IN_SET' est plus puissant et complexe qui implique l'analyse de chaîne et la création de 'SET'. – Igor

0

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

Ou 'UNION ALL' si vous récupérez des lignes qui pourraient être des doublons les uns des autres. Dans mon code, il semble que cela pourrait être assez lent cependant. –

0

Vous pouvez créer un nombre pour trier en fonction des valeurs id:

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 
0

C'est la première chose qui me vient à l'esprit. note sql est non testé, vous devrez peut-être vérifier la syntaxe correcte

est un peu lourd, mais peut-être faire l'affaire

select * from table where id = 118 
union 
select * from table where id = 17 
union 
.... and so on 
0

Je pense que si vous avez fait une requête UNION à chaque sélectionner, il pourrait retourner dans l'ordre.

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

Laide, mais je pense que ça va marcher.

2

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 

Puis JOIN:

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

Notez que vous pouvez déposer la clause IN.

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

Modifier

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

+1

+1 Pour le commentaire "inévitablement" (et totalement vrai). – Julian