有一个字段 'noticeBy' enum('email','mobile','all','auto','nothing') NOT NULL DEFAULT 'auto'。众所周知,ENUM 字段的排序相对于其索引执行。然而,它怎么可能通过它的值来排序呢?
5 回答
如排序下所述:
ENUM
值根据它们的索引号进行排序,这取决于枚举成员在列规范中列出的顺序。例如,在for'b'
之前排序。空字符串在非空字符串之前排序,而值在所有其他枚举值之前排序。'a'
ENUM('b', 'a')
NULL
为防止
ORDER BY
在列上使用子句时出现意外结果,请ENUM
使用以下技术之一:
按字母顺序指定
ENUM
列表。确保该列是按词法排序的,而不是通过编码
ORDER BY CAST(col AS CHAR)
或按索引号排序ORDER BY CONCAT(col)
。
根据第二个项目符号,您可以在将列转换为字符串后对其进行排序:
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
状态是我的 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
也可以做到这一点。