2010-06-02 5 views
8

Existe-t-il un moyen facile de commander les résultats MySQL respectivement par WHERE id IN (...) clause? Exemple:MySQL spécifiant l'ordre exact avec WHERE `id` IN (...)

SELECT * FROM articles WHERE articles.id IN (4, 2, 5, 9, 3) 

pour revenir

Article with id = 4 
Article with id = 2 
Article with id = 5 
Article with id = 9 
Article with id = 3 

et aussi

SELECT * FROM articles WHERE articles.id IN (4, 2, 5, 9, 3) LIMIT 2,2 

pour revenir

Article with id = 5 
Article with id = 9 

Mise à jour: pour être plus précis, je veux éviter la falsification des les données en p arentheses dans WHERE articles.id IN (4, 2, 5, 9, 3), puisque ces identifiants sont dynamiques et ordonnés automatiquement.

Répondre

14

Ouais, genre de:

SELECT * FROM articles 
WHERE articles.id IN (4, 2, 5, 9, 3) 
ORDER BY FIND_IN_SET(articles.id, '4,2,5,9,3') 

mais est SQL non standard et sent un peu.

+4

+1 pour une solution pragmatique. Et pour la partie "sent un peu". ;) – Tomalak

+0

Les résultats sont exactement ce que je cherchais, merci beaucoup. –

0

Je ne pense pas que vous puissiez le faire. Il n'y a pas de commande "explicite" en cours; l'instruction "in" vous indique simplement ce qu'il faut récupérer et ne contient aucune information sur la commande.

Puisque les exemples que vous avez donnés n'ont pas d'ordre évident, votre meilleur pari est de gérer ceci dans le code après que le résultat soit retourné. MySQL ne trie qu'avec ORDER BY.

1

C'est pourquoi il n'est pas rare que les tables de base de données aient quelque chose comme une colonne d'ordinalité.

articles 
+----+------------+-------+ 
| id | ordinality | (...) | 
+----+------------+-------+ 
| 2 |   2 | '' | 
| 3 |   5 | '' | 
| 4 |   1 | '' | 
| 5 |   3 | '' | 
| 9 |   4 | '' | 
+----+------------+-------+ 

SELECT * 
    FROM articles 
WHERE articles.id IN (4, 2, 5, 9, 3) 
ORDER BY articles.ordinality 
3

Cela fonctionne pour moi: ORDER BY CHAMP (Product.id, 4,9,8,5,3,11,24,16)

+0

Cela fonctionne et est en fait plus rapide que la réponse acceptée, sur ma machine de toute façon. J'ai testé avec 1000 enregistrements et 'find_in_set' a pris 0.03 secondes et' field' a pris 0.02 secondes. Je suppose que cette différence deviendrait plus marquée avec des ensembles plus grands. J'ai aussi testé avec une clause "LIMIT 2" et 'find_in_set' a pris plus de temps, 0.04 sec, alors que' field' a encore pris 0.02 sec. Personnellement, je pense que 0.02sec est encore assez lent. L'OP doit faire attention à ne pas transmettre de grands ensembles de données ou il va prendre un coup de performance! – Coder