【问题标题】:ORDER BY discrete values of text column on [My]SQL[ite][My]SQL[ite] 上文本列的 ORDER BY 离散值
【发布时间】:2011-11-08 13:12:27
【问题描述】:

我想根据文本(或枚举)列的一组有限值的任意顺序对表中的行进行排序。例如,如果“类”列可以具有值 A、B、C、D,我希望能够按 A > C > B > D 或其他组合对行进行排序,而不仅仅是按字母顺序或按枚举的本机顺序。这可能吗?

理想情况下,我想要一个适用于 SQLite 的解决方案,但 MySQL 也很有用。非常感谢!

【问题讨论】:

    标签: mysql sqlite sorting sql-order-by


    【解决方案1】:
    ORDER BY field(column, 'A', 'C', 'B', 'D')
    

    FIELD function in MySQL docs

    【讨论】:

      【解决方案2】:

      如果 mySQL 和 sqlite 减缓在 ORDER BY 子句中使用 CASE(MSSQL 会这样做,我看不出其他系统不会这样做的原因),你可以使用类似的东西:

      ORDER BY CASE
               WHEN classes ='A' THEN 1
               WHEN classes ='C' THEN 2
               WHEN classes ='B' THEN 3
               WHEN classes ='D' THEN 4
               ELSE 5
               END CASE
      

      如果该列可以按任何特定顺序包含多个选项,您也可以这样做:

      ORDER BY CASE
               WHEN classes LIKE '%A%' THEN 1
               WHEN classes LIKE '%C%' THEN 2
               WHEN classes LIKE '%B%' THEN 3
               WHEN classes LIKE '%D%' THEN 4
               ELSE 5
               END CASE
      

      虽然重载这样的字段不是正常形式,通常不推荐。

      【讨论】:

      • 虽然不像 FIELD 或 FIND_IN_SET MySQL 函数那样优雅,但它实际上适用于 SQLite(没有最终的 CASE)。谢谢!
      • 我还发现这种形式:“ORDER BY CASE classes WHEN 'A' THEN 1 WHEN 'B' THEN 2...” 也有效,看起来更好一些,可能会更多高效。
      • 是的,最后的 CASE 也没有在 MSSQL 中使用,但如果我没记错的话(我自己的代码使用 mySQL 已经有一段时间了)它是 mySQL 所需要的。
      • 是的,CASE WHEN 形式是一个有效的速记,当您不需要任何比较,除了“相等”。
      【解决方案3】:

      另一个变体 - 添加一个新的(临时?)表,例如

      class | rank
      A     | 1
      B     | 2
      C     | 3
      D     | 4
      

      然后您可以按class 列加入表格并按rank 排序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-15
        • 2020-02-19
        相关资源
        最近更新 更多