有一个字段'noticeBy'枚举('email','mobile','all','auto','nothing')NOT NULL DEFAULT'auto'。因为已知ENUM字段的排序相对于其索引执行。但是,如何通过其价值来订购呢?
答案 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
似乎没有帮助。要以特定顺序对结果进行排序,还可以同时提到ASC
或DESC
。
答案 4 :(得分:0)
对我来说最好的选择:
ORDER BY FIELD(status, 'publish','not-publish','expirated','deleted'), creation DESC
状态是我的BBDD中的字段,''中的值是枚举选项中包含的值。
我希望对您也有帮助! :)