【问题标题】:ORDER BY "ENUM field" in MYSQL在 MYSQL 中按“枚举字段”排序
【发布时间】:2013-07-10 08:18:54
【问题描述】:

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

【问题讨论】:

    标签: mysql sql enums sql-order-by


    【解决方案1】:

    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)
    

    【讨论】:

    • 非常好,谢谢!奇怪的是这个最佳(最高投票)和接受的答案不在顶部?如果是因为缺少 cmets,希望这个会有所帮助。
    • @jtubre:问题和答案之间有三个排序按钮:“Active”、“Oldest”和“Votes”。如果按票数排序,这个答案应该是最高的?但它不会在其他排序顺序下排在首位(过去接受的答案无论如何都固定在顶部,但StackOverflow changed that a few months ago)。
    【解决方案2】:

    这也有效:

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

    (我认为没有设置可以实现这一点,您必须提供排序值。)

    【讨论】:

    • 这种对 ENUM 进行排序的方式在某些情况下非常有用!真的很管用,我试过了:)
    • 完美的正是我想要的
    【解决方案3】:

    您可以随意定义您的订单:

    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。

    【讨论】:

    • 这是我需要的 :) 谢谢,Fabian。
    • 谢谢@Fabian 这对我帮助很大。
    【解决方案4】:

    对我来说最好的选择:

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

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

    希望对你也有帮助! :)

    【讨论】:

      【解决方案5】:

      就我而言,我必须按“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,就可以了。

      【讨论】:

        猜你喜欢
        • 2012-03-10
        • 1970-01-01
        • 2016-07-01
        • 2022-07-28
        • 2011-09-05
        • 2021-11-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多