48

有一个字段 'noticeBy' enum('email','mobile','all','auto','nothing') NOT NULL DEFAULT 'auto'。众所周知,ENUM 字段的排序相对于其索引执行。然而,它怎么可能通过它的值来排序呢?

4

5 回答 5

72

排序下所述:

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)
于 2013-07-11T22:02:16.117 回答
68

这也有效:

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

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

于 2013-07-11T21:42:58.587 回答
24

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

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。

于 2013-07-11T21:40:14.593 回答
0

对我来说最好的选择:

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

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

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

于 2020-06-27T18:26:26.723 回答
-1

就我而言,我必须按“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也可以做到这一点。

于 2019-09-03T14:32:12.547 回答