Commande par" enum field " en MYSQL

il y a un champ 'noticeBy' enum('email','mobile','all','auto','nothing') pas nul par défaut 'auto'. Comme il a connu l'ordre par le champ D'ENUM exécute par rapport à son index. Cependant, comment rendre possible l'ordre par ses valeurs?

27
demandé sur Andy G 2013-07-12 01:32:08

3 réponses

tel que documenté sous Tri:

ENUM les valeurs sont triées en fonction de leur numéro d'index, qui dépend de l'ordre dans lequel les membres de l'énumération ont été énumérés dans la spécification de la colonne. Par exemple, 'b' trie avant 'a'ENUM('b', 'a'). La chaîne vide trie avant les chaînes non vides, et NULL valeurs de tri avant toutes les autres valeurs d'énumération.

Pour éviter des résultats inattendus lors de l'utilisation de l' ORDER BY l'article sur un ENUM colonne, utilisez une de ces techniques:

  • spécifier le ENUM liste Par Ordre alphabétique.

  • assurez-vous que la colonne est triée lexiquement plutôt que par numéro d'index par codage ORDER BY CAST(col AS CHAR) ou ORDER BY CONCAT(col).

par la deuxième puce, vous pouvez donc trier sur la colonne après qu'elle ait été cast pour une chaîne de caractères:

ORDER BY CAST(noticeBy AS CHAR)
48
répondu eggyal 2013-07-11 22:02:16

Cela fonctionne aussi:

ORDER BY FIELD(noticeBy, 'all','auto','email','mobile','nothing')

(je ne crois pas qu'il y a un paramètre pour y parvenir, vous devez fournir le genre de valeurs.)

36
répondu Andy G 2014-05-25 22:10:55

Vous pouvez définir votre ordre 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

pour revenir à l'rangées dans l'ordre suivant: e-mail, mobile, auto, rien.

10
répondu Fabian Bigler 2013-07-11 21:40:14