2008-09-25 7 views
14

Est-il possible de faire une instruction SELECT avec un ordre prédéterminé, c.-à-d. en sélectionnant les ID 7,2,5,9 et 8 et en les retournant dans cet ordre, basé sur rien de plus que le champ ID?Renvoyer les résultats de la requête dans un ordre prédéfini

Instructions SELECT id de la table WHERE id dans (7,2,5,9,8); et SELECT id de la table WHERE id dans (8,2,5,9,7); les deux les renvoient dans le même ordre.

+0

Le titre de cette question n'est pas clair. Veuillez l'éditer pour que les gens qui défilent devant la question puissent le comprendre. –

Répondre

34

Je ne pensais pas que cela était possible, mais trouvé un blog entry here qui semble faire le genre de chose que vous êtes après:

SELECT id FROM table WHERE id in (7,2,5,9,8) 
ORDER BY FIND_IN_SET(id,"7,2,5,9,8"); 

donnera des résultats différents à

SELECT id FROM table WHERE id in (7,2,5,9,8) 
ORDER BY FIND_IN_SET(id,"8,2,5,9,7"); 

FIND_IN_SET renvoie la position de id dans le deuxième argument qui lui est donné, donc pour le premier cas ci-dessus, id de 7 est à la position 1 dans l'ensemble, 2 à 2 et ainsi de suite - mysql fonctionne en interne quelque chose comme

id | FIND_IN_SET 
---|----------- 
7 | 1 
2 | 2 
5 | 3 

puis les ordres par les résultats de FIND_IN_SET.

+0

En supposant que cela fonctionne, c'est une très bonne solution. – JosephStyons

+0

Testé sur v5 ici, et ça marche bien! Le blog ci-dessus mentionne un ensemble de requêtes plus compliqué où il peut être encore plus utile. – ConroyP

+0

Cela fonctionne, et c'est génial. :-) – ceejayoz

0

Toute commande est effectuée par les mots-clés ORDER BY, vous ne pouvez toutefois trier que par ordre croissant et décroissant. Si vous utilisez un langage tel que PHP, vous pouvez ensuite les trier en utilisant du code, mais je ne crois pas que ce soit possible avec MySQL seul.

0

Cela fonctionne dans Oracle. Pouvez-vous faire quelque chose de similaire dans MySQL?

SELECT ID_FIELD 
FROM SOME_TABLE 
WHERE ID_FIELD IN(11,10,14,12,13) 
ORDER BY 
    CASE WHEN ID_FIELD = 11 THEN 0 
     WHEN ID_FIELD = 10 THEN 1 
     WHEN ID_FIELD = 14 THEN 2 
     WHEN ID_FIELD = 12 THEN 3 
     WHEN ID_FIELD = 13 THEN 4 
    END 
1

Pourriez-vous inclure une expression de cas qui associe vos identifiants 7,2,5, ... aux ordinaux 1,2,3, ... puis l'ordre par cette expression?

0

Vous devrez peut-être créer une table temporaire avec un champ de numérotation automatique et l'insérer dans l'ordre souhaité. Puis trier sur le nouveau champ de numérotation automatique.

0

Il est hacky (et probablement lent), mais vous pouvez obtenir l'effet avec UNION ALL:

SELECT id FROM table WHERE id = 7 
UNION ALL SELECT id FROM table WHERE id = 2 
UNION ALL SELECT id FROM table WHERE id = 5 
UNION ALL SELECT id FROM table WHERE id = 9 
UNION ALL SELECT id FROM table WHERE id = 8; 

Edit: D'autres personnes ont mentionné la fonction FIND_IN_SET qui est documenté here.

-1

mieux que je peux penser est l'ajout d'une seconde colonne orderColumn:

7 1 
2 2 
5 3 
9 4 
8 5 

Et puis juste faire une ORDER BY orderColumn

0

Erm, pas vraiment. Le plus proche, vous pouvez obtenir est probablement:

SELECT * FROM table WHERE id IN (3, 2, 1, 4) ORDER BY id=4, id=1, id=2, id=3 

Mais vous ne voulez probablement pas que :)

Il est difficile de vous donner des conseils plus spécifiques, sans plus d'informations sur ce qui est dans les tableaux.

2

ORDER BY FIELD (ID, 7,2,4,5,8) est votre meilleur pari, mais il est toujours moche.

0

Vous obtenez des réponses rapides ici, ne vous ...

La raison pour laquelle je demande est que cela est la seule façon que je peux penser pour éviter le tri d'un tableau multidimensionnel complexe. Je ne dis pas qu'il serait difficile de trier, mais s'il y avait une façon plus simple de le faire avec SQL direct, alors pourquoi pas.

0

Une solution Oracle est:

SELECT id FROM table WHERE id in (7,2,5,9,8) 
ORDER BY DECODE(id,7,1,2,2,5,3,9,4,8,5,6); 

Affecte un numéro de commande à chaque ID. Fonctionne bien pour un petit ensemble de valeurs.

Questions connexes