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?
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.
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.
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.
Essayez quelque chose comme
... ORDER BY (CASE NAME WHEN 'B' THEN 0 WHEN 'A' THEN 1 WHEN ...
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
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