在MYSQL中按“ENUM字段”排序

时间:2013-07-11 21:32:09

标签: mysql sql enums sql-order-by

有一个字段'noticeBy'枚举('email','mobile','all','auto','nothing')NOT NULL DEFAULT'auto'。因为已知ENUM字段的排序相对于其索引执行。但是,如何通过其价值来订购呢?

5 个答案:

答案 0 :(得分:52)

正如Sorting所述:

  

ENUM值根据其索引号进行排序,这取决于列规范中列出枚举成员的顺序。例如,'b''a'之前对ENUM('b', 'a')进行排序。空字符串在非空字符串之前排序,NULL值在所有其他枚举值之前排序。

     

要在ORDER BY列上使用ENUM子句时防止出现意外结果,请使用以下技巧之一:

     
      
  • 按字母顺序指定ENUM列表。

  •   
  • 通过编码ORDER BY CAST(col AS CHAR)ORDER BY CONCAT(col)确保列按词汇顺序排序,而不是按索引编号排序。

  •   

根据第二个项目符号,您可以在列cast之后对列进行排序:

ORDER BY CAST(noticeBy AS CHAR)

答案 1 :(得分:46)

这也有效:

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

(我不相信有一个设置来实现这一点,你必须提供排序值。)

答案 2 :(得分:11)

您可以根据需要定义订单:

ORDER BY CASE noticeBy
           WHEN 'email' THEN 1
           WHEN 'mobile' THEN 2
           WHEN 'all' THEN 3
           WHEN 'auto' THEN 4
           ELSE 5
         END

这将按以下顺序返回行:email,mobile,all,auto,nothing。

答案 3 :(得分:0)

在我的情况下,我必须按“ ENUM”字段对枚举结果进行排序,并且还必须确保值按DESCENDING顺序排列。我的枚举具有以下值:'Open','Closed'

因此,当我使用ORDER BY CAST(status AS CHAR)时,结果按以下顺序排列:

Closed
Open
Open

但是我希望先显示Open状态票证,然后显示Closed票证。因此,我使用了以下内容:

ORDER BY CAST(status AS CHAR) DESC

这给了我想要的订单,即

Open
Open
Closed

摘要:

仅在枚举上使用ORDER BY CAST似乎没有帮助。要以特定顺序对结果进行排序,还可以同时提到ASCDESC

答案 4 :(得分:0)

对我来说最好的选择:

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

状态是我的BBDD中的字段,''中的值是枚举选项中包含的值。

我希望对您也有帮助! :)

相关问题