【发布时间】:2013-07-10 08:18:54
【问题描述】:
有一个字段 'noticeBy' enum('email','mobile','all','auto','nothing') NOT NULL DEFAULT 'auto'。众所周知,ENUM 字段的排序相对于其索引执行。但是,怎么可能通过它的值来排序呢?
【问题讨论】:
标签: mysql sql enums sql-order-by
有一个字段 'noticeBy' enum('email','mobile','all','auto','nothing') NOT NULL DEFAULT 'auto'。众所周知,ENUM 字段的排序相对于其索引执行。但是,怎么可能通过它的值来排序呢?
【问题讨论】:
标签: mysql sql enums sql-order-by
如Sorting 中所述:
ENUM值根据它们的索引号排序,这取决于枚举成员在列规范中列出的顺序。例如,对于ENUM('b', 'a'),'b'排在'a'之前。空字符串排在非空字符串之前,NULL值排在所有其他枚举值之前。为防止在
ENUM列上使用ORDER BY子句时出现意外结果,请使用以下技术之一:
按字母顺序指定
ENUM列表。通过编码
ORDER BY CAST(col AS CHAR)或ORDER BY CONCAT(col),确保列按词法排序,而不是按索引号排序。
根据第二个项目符号,因此您可以在将 cast 转换为字符串后的列上进行排序:
ORDER BY CAST(noticeBy AS CHAR)
【讨论】:
这也有效:
ORDER BY FIELD(noticeBy, 'all','auto','email','mobile','nothing')
(我认为没有设置可以实现这一点,您必须提供排序值。)
【讨论】:
您可以随意定义您的订单:
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。
【讨论】:
对我来说最好的选择:
ORDER BY FIELD(status, 'publish','not-publish','expirated','deleted'), creation DESC
Status 是我的 BBDD 中的字段,'' 中的值是枚举选项中的值。
希望对你也有帮助! :)
【讨论】:
就我而言,我必须按“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,就可以了。
【讨论】: