Comment définir un ordre personnalisé par ordre dans mySQL
Dans MySQL comment définir un ordre de tri personnalisé.
Pour essayer d'expliquer ce que je veux considérer ce tableau:
ID Language Text
0 ENU a
0 JPN b
0 DAN c
1 ENU d
1 JPN e
1 DAN f
2 etc...
Ici, je veux retourner toutes les lignes triées par langue et Id croissant afin que Language = ENU Vienne en premier, puis JPN et enfin DAN.
Le résultat devrait être: a, d,b,e,c, F etc.
Est-ce même possible?
3 réponses
MySQL a une fonction pratique appelée FIELD()
ce qui est excellent pour des tâches comme celle-ci.
ORDER BY FIELD(Language,'ENU','JPN','DAN'), ID
Notez cependant que
-
Cela rend votre SQL moins portable, car d'autres SGBD peuvent ne pas avoir une telle fonction
Lorsque votre liste de langues (ou d'autres valeurs à trier) devient beaucoup plus longue, il est préférable d'avoir une table séparée avec une colonne sortorder pour eux, et de la joindre à vos requêtes pour la commande.
Si ce sont les trois seules valeurs, alors vous pouvez utiliser a CASE
expression :
ORDER BY `ID`,
CASE `Language`
WHEN 'ENU' THEN 1
WHEN 'JPN' THEN 2
WHEN 'DAN' THEN 3
END
(S'il peut y avoir d'autres valeurs, vous pouvez ajouter une logique supplémentaire pour garder l'ordre cohérent; par exemple, vous pouvez ajouter ELSE 4
à cette expression CASE
, puis Trier par Language
lui - même comme troisième critère d'ordre:
ORDER BY `ID`,
CASE `Language`
WHEN 'ENU' THEN 1
WHEN 'JPN' THEN 2
WHEN 'DAN' THEN 3
ELSE 4
END,
`Language`
)
Vous avez quelques options désinvoltes, la première est de changer de langue pour être ENUM (en supposant que cela est possible, et vous n'attendez que quelques variations)
Si vous le spécifiez comme ENUM('ENU','JPN','DAN')
alors {[2] } ordonnera dans l'ordre que vous spécifiez.
La seconde impliquera un cas quelque part, c'est-à-dire
SELECT * FROM table
ORDER BY CASE Language
WHEN 'ENU' THEN 3
WHEN 'JPN' THEN 2
WHEN 'DAN' THEN 1
ELSE 0
END DESC, ID ASC
En termes de performances, la méthode ENUM retournera des résultats plus rapides, mais sera plus compliquée si vous avez besoin d'ajouter plus de langues. Une troisième option serait d'ajouter une table de normalisation pour le Langues cependant qui peuvent être exagérées dans ce cas.