Question

Est-il possible de faire une instruction SELECT avec un ordre prédéterminé, c'est à dire. en sélectionnant les identifiants 7,2,5,9 et 8 et en les renvoyant dans cet ordre , en vous basant uniquement sur le champ ID?

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

Était-ce utile?

La solution

Je ne pensais pas que c'était possible, mais j'ai trouvé une entrée de blog ici qui semble faire le genre de chose que vous recherchez:

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é. Ainsi, pour le premier cas ci-dessus, id sur 7 est à la position 1 de l'ensemble , 2 à 2 et ainsi de suite - mysql fonctionne en interne sur quelque chose comme

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

puis les commandes en fonction des résultats de FIND_IN_SET .

Autres conseils

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

Pourriez-vous inclure une expression de casse qui mappe vos identifiants 7,2,5, ... aux ordinaux 1, 2, 3, ... et ensuite, en fonction de cette expression?

Toutes les commandes sont effectuées à l'aide des mots clés ORDER BY. Cependant, vous ne pouvez trier que par ordre croissant ou décroissant. Si vous utilisez un langage tel que PHP, vous pouvez les trier en conséquence avec du code, mais je ne crois pas que ce soit possible uniquement avec MySQL.

Cela fonctionne sous 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

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

Euh, pas vraiment. Le plus proche que vous puissiez 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 cela:)

Il est difficile de vous donner des conseils plus spécifiques sans plus d'informations sur le contenu des tableaux.

C'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;

Modifier: d'autres personnes ont mentionné la fonction find_in_set qui est documentée ici .

Vous obtenez des réponses rapidement par ici, n'est-ce pas & <8230;

La raison pour laquelle je pose cette question est que c’est la seule façon pour moi d’éviter de trier un tableau multidimensionnel complexe. Je ne dis pas que ce serait difficile à classer, mais s’il existait un moyen plus simple de le faire avec SQL droit, alors pourquoi pas.

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);

Ceci attribue un numéro de commande à chaque identifiant. Fonctionne bien pour un petit ensemble de valeurs.

Le mieux que je puisse penser est d’ajouter une deuxième colonne orderColumn:

7 1
2 2
5 3
9 4 
8 5

Et puis faites juste une commande ORDER BY orderColumn

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top