132 votes

MySql order by specific ID values (Ordre MySql par valeurs d'identification spécifiques)

Est-il possible de trier dans MySQL par "order by" en utilisant un ensemble prédéfini de valeurs de colonnes ( ID ) comme order by (ID=1,5,4,3) donc j'obtiendrais les enregistrements 1, 5, 4, 3 dans cet ordre ?

UPDATE : Pourquoi j'ai besoin de ce...

Je veux que mes enregistrements changent de façon aléatoire toutes les 5 minutes. J'ai une tâche cron qui met à jour la table pour y mettre un ordre de tri différent et aléatoire.

Il n'y a qu'un seul problème ! PAGINATION.

J'aurai des visiteurs qui viendront sur ma page, et je leur donnerai les 20 premiers résultats. Ils attendront 6 minutes, iront à la page 2 et obtiendront les mauvais résultats car l'ordre de tri a déjà changé.

J'ai donc pensé que si je plaçais tous les ID dans une session à la page 2, nous obtiendrions les enregistrements corrects même si le tri avait déjà été modifié.

Existe-t-il d'autres meilleur Comment faire ?

259voto

Manjula Weerasinge Points 1787

Vous pouvez utiliser les fonctions ORDER BY et FIELD. Voir aussi http://lists.mysql.com/mysql/209784

SELECT * FROM table ORDER BY FIELD(ID,1,5,4,3)

Il utilise Champ() qui "Renvoie l'index (position) de str dans la liste str1, str2, str3, .... Retourne 0 si str n'est pas trouvé" selon la documentation. En fait, vous triez l'ensemble des résultats en fonction de la valeur de retour de cette fonction, qui est l'indice de la valeur du champ dans l'ensemble donné.

36voto

NPE Points 169956

Vous devriez pouvoir utiliser CASE pour cela :

ORDER BY CASE id
  WHEN 1 THEN 1
  WHEN 5 THEN 2
  WHEN 4 THEN 3
  WHEN 3 THEN 4
  ELSE 5
END

27voto

Dans la documentation officielle de mysql, à propos de ORDER BY Quelqu'un a indiqué qu'il était possible d'utiliser FIELD pour cette question, comme ceci :

SELECT * FROM table ORDER BY FIELD(id,1,5,4,3)

Il s'agit d'un code non testé qui devrait théoriquement fonctionner.

17voto

SELECT * FROM table ORDER BY id='8' DESC, id='5' DESC, id='4' DESC, id='3' DESC

Si j'ai 10 registres par exemple, de cette façon les ID 1, 5, 4 et 3 apparaîtront en premier, les autres registres apparaîtront ensuite.

Exposition normale 1 2 3 4 5 6 7 8 9 10

De cette manière

8 5 4 3 1 2 6 7 9 10

6voto

Bjoern Points 7655

Il existe un autre moyen de résoudre ce problème. Ajoutez un tableau séparé, quelque chose comme ceci :

CREATE TABLE `new_order` (
  `my_order` BIGINT(20) UNSIGNED NOT NULL,
  `my_number` BIGINT(20) NOT NULL,
  PRIMARY KEY (`my_order`),
  UNIQUE KEY `my_number` (`my_number`)
) ENGINE=INNODB;

Ce tableau sera maintenant utilisé pour définir votre propre mécanisme de commande.

Ajoutez-y vos valeurs :

my_order | my_number
---------+----------
       1 |         1
       2 |         5
       3 |         4
       4 |         3

...et modifiez ensuite votre instruction SQL en joignant cette nouvelle table.

SELECT *
FROM your_table AS T1
INNER JOIN new_order AS T2 on T1.id = T2.my_number
WHERE ....whatever...
ORDER BY T2.my_order; 

Cette solution est un peu plus complexe que les autres, mais elle vous permet de ne pas modifier votre SELECT -Chaque fois que vos critères de commande changent, il suffit de modifier les données dans le tableau des commandes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X