web-dev-qa-db-fra.com

ORDRE PAR "champ ENUM" dans MYSQL

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?

36
abdulmanov.ilmir

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' Pour ENUM('b', 'a'). La chaîne vide est triée avant les chaînes non vides et les valeurs NULL 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 colonne ENUM, 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) ou ORDER 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)
60
eggyal

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.)

50
Andy G

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.

16
Fabian Bigler

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.

0
Devner