Il y a un champ 'noticeBy' enum ('email', 'mobile', 'all', 'auto', 'nothing') NOT NULL DEFAULT 'auto'. Comme il est connu, le classement par champ ENUM s'effectue par rapport à son index. Mais comment rendre l'ordre possible par ses valeurs?
Comme indiqué sous Tri :
ENUM
les valeurs sont triées en fonction de leurs numéros d'index, qui dépendent de l'ordre dans lequel les membres d'énumération ont été répertoriés dans la spécification de colonne. Par exemple,'b'
Trie avant'a'
PourENUM('b', 'a')
. La chaîne vide est triée avant les chaînes non vides et les valeursNULL
sont triées avant toutes les autres valeurs d'énumération.Pour éviter des résultats inattendus lors de l'utilisation de la clause
ORDER BY
Sur une colonneENUM
, utilisez l'une des techniques suivantes:
Spécifiez la liste
ENUM
dans l'ordre alphabétique.Assurez-vous que la colonne est triée lexicalement plutôt que par numéro d'index en codant
ORDER BY CAST(col AS CHAR)
ouORDER BY CONCAT(col)
.
Par la deuxième puce, vous pouvez donc trier la colonne après qu'elle a été cast en une chaîne:
ORDER BY CAST(noticeBy AS CHAR)
Cela fonctionne également:
ORDER BY FIELD(noticeBy, 'all','auto','email','mobile','nothing')
(Je ne pense pas qu'il existe un paramètre pour y parvenir, vous devez fournir les valeurs de tri.)
Vous pouvez définir votre commande comme vous le souhaitez:
ORDER BY CASE noticeBy
WHEN 'email' THEN 1
WHEN 'mobile' THEN 2
WHEN 'all' THEN 3
WHEN 'auto' THEN 4
ELSE 5
END
Cela renverra les lignes dans l'ordre suivant: e-mail, mobile, tout, auto, rien.
Dans mon cas, j'ai dû trier les résultats d'énumération par le champ "ENUM" et également m'assurer que les valeurs sont dans l'ordre DESCENDANT. Mon énumération avait les valeurs suivantes: 'Open','Closed'
Donc, quand j'ai utilisé ORDER BY CAST(status AS CHAR)
, les résultats étaient dans cet ordre:
Closed
Open
Open
Mais je voulais que les tickets d'état Open
soient affichés en premier, puis les tickets Closed
. J'ai donc utilisé ce qui suit:
ORDER BY CAST(status AS CHAR) DESC
Cela m'a donné l'ordre que je cherchais, c'est-à-dire.
Open
Open
Closed
Résumé:
L'utilisation de ORDER BY CAST
Sur une énumération ne semble pas avoir aidé. Pour trier les résultats dans un ordre spécifique, mentionnant ASC
ou DESC
, a fait l'affaire.