2010-06-15 3 views
2

je la requête suivanteobtenir le résultat de mysql orderd par clause IN

SELECT * FROM invoice WHERE invoice_id IN (13, 15, 9, 27) 

Mon résultat est:

invoice_id | invoice_number | ... 
------------------------------------ 
9   | 201006003  | 
13   | 201006020  | 
15   | 201006022  | 
27   | 201006035  | 

qui est le jeu de résultat que je veux, sauf ce qui est ordonné par le invoice_id (qui est une valeur auto-incrémentée).

Maintenant, je veux le résultat dans l'ordre que j'ai spécifié dans ma requête (13, 15, ...). Y a-t-il un moyen d'obtenir cela?

L'arrière-plan est que j'ai un DataTable lié à un DataGridView. L'utilisateur peut filtrer et trier le résultat, mais s'il veut imprimer le résultat, je n'utilise pas le DataTable pour l'impression car il contient seulement les colonnes les plus importantes et je retire les enregistrements entiers de la base de données et les passe à mon contrôle d'impression .

J'ai également essayé d'étendre le DataTable existant avec les résultats manquants mais cela semble plus lent que d'utiliser la requête IN (...).

+0

Je ne pense pas que ce soit possible simplement en utilisant un orderby, mais il y a des solutions de contournement. Pouvez-vous générer une autre requête, ou est-ce que orderby est votre seul choix? – simendsjo

Répondre

3

Il est laid, mais vous pouvez faire:

ORDER BY CASE invoice_id WHEN 13 THEN 0 WHEN 15 THEN 1 WHEN 9 THEN 2 WHEN 27 THEN 3 ELSE 4 END 

En fait, il y a la fonction CHAMP:

ORDER BY FIELD(invoice_id, 13, 15, 9, 27) 

Les FIELD function retourne la position du premier argument dans la liste des autres.

Ou, si vous générez dynamiquement, vous pouvez faire:

WHERE invoice_id IN ({list}) ORDER BY FIND_IN_SET(invoice_id, '{list}') 
+0

+1: La plus complète réponse –

+0

ORDER BY FIELD fonctionne comme un charme. Merci. –

3

Vous voulez l'ordre FIELD par le paramètre.

SELECT * FROM invoice WHERE invoice_id IN (13, 15, 9, 27) ORDER BY FIELD (invoice_id, 13, 15, 9, 27) 
+0

Nice one. Je ne savais pas que – simendsjo

+0

merci, ircmaxell a été quelques secondes plus rapide, mais vous méritez une upvote, aussi;) –

Questions connexes