116 votes

MySQL - ORDER BY valeurs dans IN ()

Hé - J'espère pouvoir trier les éléments renvoyés dans la requête suivante en fonction de l'ordre dans lequel ils ont été entrés dans la fonction IN () .

CONTRIBUTION:

 SELECT id, name FROM mytable WHERE name IN ('B', 'A', 'D', 'E', 'C');
 

SORTIE:

 |   id   |   name  |
^--------^---------^
|   5    |   B     |
|   6    |   B     |
|   1    |   D     |
|   15   |   E     |
|   17   |   E     |
|   9    |   C     |
|   18   |   C     |
 

Des idées? Merci d'avance!

243voto

Ayman Hourieh Points 39435
 SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY FIELD(name, 'B', 'A', 'D', 'E', 'C')
 

La fonction FIELD renvoie la position de la première chaîne dans la liste restante de chaînes.

Toutefois, il est beaucoup mieux, en termes de performances, d’avoir une colonne indexée qui représente votre ordre de tri, puis de trier en fonction de cette colonne.

29voto

joedevon Points 1291

Une autre option à partir d'ici: http://dev.mysql.com/doc/refman/5.0/en/sorting-rows.html

 select * 
from tablename 
order by priority='High' DESC, priority='Medium' DESC, priority='Low" DESC;
 

Donc, dans votre cas (non testé) serait

 SELECT id, name
FROM mytable
WHERE name IN ('B', 'A', 'D', 'E', 'C')
ORDER BY name = 'B', name = 'A', name = 'D', name =  'E', name = 'C';
 

Selon ce que vous faites, je trouve ça un peu bizarre mais je le fais toujours fonctionner après avoir joué un peu avec.

4voto

Vladimir Dyuzhev Points 10647

Essayez quelque chose comme

 ... ORDER BY (CASE NAME WHEN 'B' THEN 0 WHEN 'A' THEN 1 WHEN ...
 

3voto

Hun Points 21

Cela peut peut-être aider quelqu'un (p_CustomerId est passé dans SP):

 SELECT CompanyAccountId, CompanyName
FROM account
LEFT JOIN customer where CompanyAccountId = customer.AccountId
GROUP BY CompanyAccountId
ORDER BY CASE WHEN CompanyAccountId IN (SELECT AccountId 
                                          FROM customer
                                          WHERE customerid= p_CustomerId) 
                 THEN 0
                 ELSE 1
          END, CompanyName;
 

Description: Je veux afficher la liste des comptes. Ici, je passe un identifiant client dans sp. Maintenant, il va lister les noms de compte avec les comptes liés à ce que les clients sont affichés en haut, suivis par les autres comptes dans l'ordre alphabétique.

2voto

Robert Harvey Points 103562

Vous avez besoin d'une autre colonne (numérique) dans votre tableau, dans laquelle vous spécifiez l'ordre de tri. La clause IN ne fonctionne pas de cette façon.

 B - 1
A - 2
D - 3
E - 4
C - 5
 

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