Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ORDER BY "ENUM field" in MYSQL

There is a field 'noticeBy' enum('email','mobile','all','auto','nothing') NOT NULL DEFAULT 'auto'. As it known ordering by ENUM field performs relative to its index. However, how it possible make order by its values?

like image 586
abdulmanov.ilmir Avatar asked Jul 11 '13 21:07

abdulmanov.ilmir


People also ask

Does order matter in enumeration?

If this type is specified (in a table definition), numbers can be in an arbitrary order. However, the order does not matter. Neither the string nor the numeric value in an Enum can be NULL.

What does ENUM mean in MySQL?

An ENUM is a string object with a value chosen from a list of permitted values that are enumerated explicitly in the column specification at table creation time.

How do I declare an enum in MySQL?

An ENUM is a string object whose value is decided from a set of permitted literals(Values) that are explicitly defined at the time of column creation. Succinct data storage required to store data in limited size columns.


1 Answers

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' for ENUM('b', 'a'). The empty string sorts before nonempty strings, and NULL values sort before all other enumeration values.

To prevent unexpected results when using the ORDER BY clause on an ENUM 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) or ORDER 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) 
like image 171
eggyal Avatar answered Oct 07 '22 14:10

eggyal