J'essaie de renvoyer des enregistrements en fonction de leurs identifiants dans MySQL sans passer commande.
Mais lorsque j'exécute la requête, elle les classe du numéro d'identification le plus bas au numéro d'identification le plus élevé.
SELECT * FROM événements WHERE id = 11 ou id = 4 ou id = 9 ou id = 5
Le résultat ressemblera à ceci: 4,5,9,11
Comment peut revenir comme ça: 11,4,9,5
3 Réponses :
Essayez d'utiliser ORDER BY FIELD (id, ...) :
SELECT *
FROM events
WHERE id IN (4, 5, 9, 11)
ORDER BY
CASE WHEN id = 11 THEN 1
WHEN id = 4 THEN 2
WHEN id = 9 THEN 3
WHEN id = 5 THEN 4
ELSE 5 END;
Pour savoir pourquoi votre requête actuelle affiche le 4,5,9, 11 , même sans que vous utilisiez une clause ORDER BY explicite, une explication est que la colonne id est la clé primaire en cluster pour votre table. Dans ce cas, les données seraient en fait stockées dans cet ordre sur le disque, et lors de la sélection, ce serait l'ordre naturel renvoyé.
Modifier:
Sur les autres fournisseurs de bases de données, qui ne prennent pas en charge FIELD , nous pouvons commander en utilisant une expression CASE :
SELECT * FROM events WHERE id IN (4, 5, 9, 11) ORDER BY FIELD (id, 11, 4, 9, 5)
p >
Il fait des retours au hasard à chaque fois que j'exécute la requête et ce n'est pas fixe
Désolé, j'ai mal lu votre exigence. Essayez d'utiliser ORDER BY FIELD (id, ...) .
Je pense que vous souhaitez utiliser FIELD ()
SELECT * FROM events WHERE id=11 or id=4 or id=9 or id=5
ORDER BY CASE WHEN id = 11 THEN 1
WHEN id = 4 THEN 2
WHEN id = 8 THEN 3
WHEN id = 5 THEN 4
ELSE 5
END
Ou la méthode SQL plus ANSI (fonctionne également pour d'autres fournisseurs de bases de données)
SELECT
events.*
FROM (
SELECT
11 AS id
, 1 AS position
UNION ALL
SELECT
4 AS id
, 2 AS position
UNION ALL
SELECT
8 AS id
, 3 AS position
UNION ALL
SELECT
5 AS id
, 4 AS position
) AS sorting
INNER JOIN
events
ON
sorting.id = events.id
ORDER BY
sorting.position ASC
Ou le meilleur ANSI SQL comme il se doit (fonctionne également pour d'autres fournisseurs de bases de données)
SELECT * FROM events WHERE id=11 or id=4 or id=9 or id=5 ORDER BY FIELD(id, 11,4,8,5)
"Le remplacement de FIELD dans une autre base de données est vraiment CASE, pas une requête d'union." en effet mais l'union fonctionne aussi @TimBiegeleisen CASE WHEN id = 11 THEN 1 WHEN id = 4 THEN 2 WHEN id = 8 THEN 4 WHEN id = 5 THEN 4 ELSE 5 END est en effet plus facile c'est tard fini ici blâmer ça
Surprise de la Saint-Sylvestre +1. C'est déjà le 1er janvier où j'habite :-)
a obtenu le meilleur de ma nouvelle année pour vous aussi ;-)
** Mis à jour Comme vous voulez un ordre fixe, vous pouvez utiliser ORDER BY FIELD:
SELECT * FROM events WHERE id IN (4, 5, 9, 11) ORDER BY FIELD (id, 11, 4, 9, 5)
Le PO veut un ordre fixe, voir les commentaires sous ma réponse.
Je ne sais pas pourquoi cela a été voté pour ... parce que cela ne correspond pas aux exigences de démarrage du sujet.
Un peu hors sujet, mais vous pouvez consolider ces clauses where dans
WHERE id IN (11, 4, 9, 5). L'ordre dans lequel ils apparaissent dans le WHERE n'affecte pas l'ordre dans lequel ils retournent, bien que d'autres aient de bons conseils sur la façon de les ordonner comme vous le souhaitez.