2009-08-26 9 views
53

J'ai un tableau PHP avec des nombres d'ID dedans. Ces numéros sont déjà commandés.MySQL ORDER BY IN()

Maintenant, je voudrais obtenir mon résultat via la méthode IN(), pour obtenir tous les ID.

Toutefois, ces ID doivent être triés comme dans la méthode IN.

Par exemple:

IN(4,7,3,8,9) 

devrait donner un résultat comme:

4 - Article 4 
7 - Article 7 
3 - Article 3 
8 - Article 8 
9 - Article 9 

Toutes les suggestions? Peut-être qu'il y a une fonction pour le faire?

Merci!

+0

Quelles sont les autres données associées à ces numéros? Cela pourrait nous donner une idée de la raison pour laquelle vous le souhaitez dans cet ordre. – Randell

Répondre

125

Je pense que vous cherchez peut-être pour la fonction FIELD - alors que normalement considéré comme une fonction de chaîne, il fonctionne très bien pour les numéros, aussi!

ORDER BY FIELD(field_name, 3,2,5,7,8,1) 
+1

Exactement. Je regardais juste dans le livre de cuisine MySQL de Paul Dubois et je l'ai trouvé: SELECT id, nom FROM articles WHERE id IN (7,4,21) COMMANDER PAR FIELD (id, 7,4,21) Merci! –

+0

Darn vous les gens sont rapides. ;-) – deceze

+0

@Henk, heureux de vous avoir aidé, mais une acceptation sans un upvote est un événement très spécial sur SO - une raison pour laquelle vous ne m'avez pas upvoted? -) –

-3

Vous aurez juste besoin de donner l'ordre correct par la déclaration.

SELECT ID FROM myTable WHERE ID IN(1,2,3,4) ORDER BY ID 

Pourquoi voudriez-vous que vos données soient triées comme dans votre exemple?

Si vous ne me dérange pas concatening requêtes longues, essayez de cette façon:

SELECT ID FROM myTable WHERE ID=1 
UNION 
SELECT ID FROM myTable WHERE ID=3 
UNION 
SELECT ID FROM myTable WHERE ID=2 
+0

Merci. Mais cela ne fera pas l'affaire: SELECT id, nom FROM articles WHERE id IN (7,4,21) ORDER BY id Devrait montrer 7,4,21. Mais à la place, il montrera: 4,7,21 ... –

+2

L'Union ne garantit * pas * la commande. – paxdiablo

+0

À droite, donc mon deuxième tir, donnera l'ordre voulu mais n'est pas la chose la plus douce. –

0

standard SQL ne fournit pas une façon de le faire (MySQL peut, mais je préfère des solutions fournisseur neutre donc je peut changer de SGBD à tout moment).

Ceci est quelque chose que vous devriez faire en post-traitement après le résultat est retourné. SQL ne peut les renvoyer que dans un ordre spécifié dans la clause "order by" (ou dans n'importe quel ordre s'il n'y a pas une telle clause).

L'autre possibilité (bien que je ne l'aime pas, je suis honoré de vous donner le choix) est de faire plusieurs voyages dans la base de données, un pour chaque ID, et les traiter comme ils viennent:

select * from tbl where article_id = 4; 
// Process those. 
select * from tbl where article_id = 7; 
// Process those. 
: : : : : 
select * from tbl where article_id = 9; 
// Process those. 
+0

Vous pouvez le faire en SQL standard en utilisant 'CASE col WHEN * 1er-val * THEN 1 WHEN * 2e-val * THEN 2 ... END' – derobert

+1

... pas que je recommanderais une telle chose! – derobert

8

Vous pouvez utiliser FIELD():

ORDER BY FIELD(id, 3,2,5,7,8,1) 

Renvoie l'index (position) de str dans le str1, str2, str3, .... Renvoie 0 si str est introuvable.

C'est un peu un hack moche si, donc vraiment seulement l'utiliser si vous n'avez pas d'autre choix. Le tri de la sortie dans votre application peut être meilleur.