【问题标题】:sql sort by int, except for one int value which has a different ordersql 按 int 排序,除了一个具有不同顺序的 int 值
【发布时间】:2015-01-07 11:42:11
【问题描述】:

我想对数据库中的记录列表进行排序。检索到的记录根据具有 int 值的列进行排序。可能的 int 值是 1,2,3,4,5。所需的排序顺序是 1,3,2,4,5

所以我不能使用Order by table.a asc。检索所需订单的查询应该是什么?例如我的表有以下记录

---------------------
name     | to_order |
--------------------
  n1     |  1
--------------------
  n2     |  2
--------------------
  n3     |  3
--------------------

我的查询结果应该是 (n1,1),(n3,3),(n2,2)。

注意:我使用的是 mysql

【问题讨论】:

    标签: mysql sql sorting


    【解决方案1】:

    您可以在 order by 子句中添加 case 语句

        SELECT name, to_order
    FROM Table1
    ORDER BY
        (
         CASE
           WHEN to_order = 1 THEN 0
           WHEN to_order = 3 THEN 1
           ELSE 2
         END
        ),
        to_order
    

    为 3 添加大小写,以便优先考虑其他数字。我将 1 包括在内,因为 1 仍应优先于 3

    【讨论】:

    • ,+1 您的查询也可以正常工作。我用类似的东西更新了我的答案。
    • @RADAR 是的,这将解决它。也删除了我对您的回答的反对票:)
    • 嗨,你能解释一下这个案例例程,特别是 THEN 之后的 0 和 1 吗?
    • 0,1,2 是附加的排序列值。意思是如果订单是 1,让我们给它一个最大的排序优势,给它一个 0 值,如果是 3,让它给它 1,对于任何其他数字,让它给它 2。对于所有 2 个数字,它将按通常的“to_order”排序列。
    【解决方案2】:

    我会这样写:

    order by (case when to_order = 2 then 3
                   when to_order = 3 then 2
                   else to_order
              end)
    

    【讨论】:

      【解决方案3】:

      对于您显示的严格限制的数据,case 语句是迄今为止最有效的解决方案。但是,如果您有 5 个以上的值,或者将来可能扩展到 5 个以上的值,或者您可能不得不在某个时间更改排序,那么您可能希望通过移动排序标准到一个单独的表。

      OldOrder    NewOrder
      ========    ========
         1           1
         2           3
         3           2
         4           4
         5           5
      

      因此您的查询将加入第一个字段并按第二个字段排序。

      select ...
      from   ...
      inner join SortTable st
              on st.OldOrder = to_order
      where ...
      order by st.NewOrder, ...;
      

      然后要添加新值或更改排序顺序,您只需更改表格而不是重写所有代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-22
        • 2014-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-11
        • 1970-01-01
        相关资源
        最近更新 更多