ORDER BY "ENUM field" in MYSQL
As documented under Sorting:
ENUM
values are sorted based on their index numbers, which depend on the order in which the enumeration members were listed in the column specification. For example,'b'
sorts before'a'
forENUM('b', 'a')
. The empty string sorts before nonempty strings, andNULL
values sort before all other enumeration values.To prevent unexpected results when using the
ORDER BY
clause on anENUM
column, use one of these techniques:
Specify the
ENUM
list in alphabetic order.Make sure that the column is sorted lexically rather than by index number by coding
ORDER BY CAST(col AS CHAR)
orORDER BY CONCAT(col)
.
Per the second bullet, you can therefore sort on the column after it has been cast to a string:
ORDER BY CAST(noticeBy AS CHAR)
This also works:
ORDER BY FIELD(noticeBy, 'all','auto','email','mobile','nothing')
(I don't believe that there is a setting to achieve this, you have to provide the sort-values.)
You can define your order however you wish:
ORDER BY CASE noticeBy
WHEN 'email' THEN 1
WHEN 'mobile' THEN 2
WHEN 'all' THEN 3
WHEN 'auto' THEN 4
ELSE 5
END
This will return the rows in the following order: email, mobile, all, auto, nothing.