0
votes

Comment retourner des enregistrements dans MySQL avec un ordre "personnalisé"

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


1 commentaires

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.


3 Réponses :


6
votes

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;

Démo

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 >


2 commentaires

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, ...) .



5
votes

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)


3 commentaires

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



2
votes

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


2 commentaires

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.