web-dev-qa-db-fra.com

MySQL - ORDER BY valeurs dans IN ()

J'espère pouvoir trier les éléments renvoyés dans la requête suivante par 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? 

91
Matt
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 de 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 selon cette colonne.

196
Ayman Hourieh

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

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

26
joedevon

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 en sp. Maintenant, il va lister les noms de compte avec les comptes liés à ce que les clients sont en haut suivis par les autres comptes dans l'ordre alphabétique.

3
Hun

Essayez quelque chose comme 

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

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
2
Robert Harvey

juste utiliser 

order by INSTR( ',B,C,D,A,' ,  concat(',' , `field`, ',' ) )

éviter la situation comme 

 INSTR('1,2,3,11' ,`field`) 

se terminera par un résultat non ordonné: 1 et 11 alternants 

0
PercyQQ