ORDER BY “ENUM field” in MYSQL

前端 未结 5 723
忘掉有多难
忘掉有多难 2020-12-04 23:40

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

相关标签:
5条回答
  • 2020-12-05 00:12

    The best option to me:

    ORDER BY FIELD(status, 'publish','not-publish','expirated','deleted'), creation DESC
    

    Status is the field in my BBDD, and values in '' are the values that has in enum options.

    I hope that help u too! :)

    0 讨论(0)
  • 2020-12-05 00:15

    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)
    
    0 讨论(0)
  • 2020-12-05 00:15

    In my case, I had to sort enum results by the "ENUM" field and also make sure the values are in DESCENDING order. My enum had the following values: 'Open','Closed'

    So when I used ORDER BY CAST(status AS CHAR), the results were in this order:

    Closed
    Open
    Open
    

    But I wanted the Open status tickets to be shown first and then the Closed tickets. So I used the following:

    ORDER BY CAST(status AS CHAR) DESC

    This gave me the order that I was looking for i.e.

    Open
    Open
    Closed
    

    Summary:

    Just using ORDER BY CAST on an enum did not seem to help. To sort the results in a specific order, mentioning ASC or DESC as well, did the trick.

    0 讨论(0)
  • 2020-12-05 00:18

    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.

    0 讨论(0)
  • 2020-12-05 00:20

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

    0 讨论(0)
提交回复
热议问题