【问题标题】:MySQL order by with conditionMySQL 按条件排序
【发布时间】:2015-09-19 16:14:44
【问题描述】:

有带列的订单表:statuscreated_at 具有值的状态列:新、处理、其他。

问题是选择所有订单,首先是状态为新的,然后是状态处理,然后是所有其他订单。 新订单和处理订单按created_at升序排序,所有其他订单按created_at降序排序。 我尝试了许多不同的方法,但都坚持了下来。

例如尝试与联合两个选择组合,但结果联合忽略内部查询中的选择顺序。

或其他变体:

SELECT orders.status, orders.created_at FROM `orders`  ORDER BY status =     'new' DESC, status = 'processing' DESC,
CASE 
  WHEN (orders.status='new' or orders.status='processing') 
  THEN -created_at 
  ELSE created_at
END;

也不行。

【问题讨论】:

    标签: mysql sql sql-order-by


    【解决方案1】:

    你可以用这个:

    SELECT orders.status, orders.created_at
    FROM `orders`
    ORDER BY
      status='new' DESC,
      status='processing' DESC,
      CASE WHEN status IN ('new', 'processing') THEN created_at END ASC,
      CASE WHEN status NOT IN ('new', 'processing') THEN created_at END DESC
    

    请看一下这个fiddle。 当状态为 ('new', 'processing') 第一种情况时将返回将按升序排序的创建日期,否则为 null。 当状态不在 ('new', 'processing') 第二种情况时,将返回按降序排列的创建日期。

    【讨论】:

    • @lad2025 我认为操作人员首先想要新订单,然后是状态处理,然后是所有其他人,你的情况什么时候会先处理订单。 FIELD(status, 'processing', 'new') DESC 可能是另一种选择,我喜欢有两条线,但我会尝试哪条表现更好
    【解决方案2】:

    这在 Oracle 中有效。请检查它是否也适用于 MySQL。想法是在case语句中以desc顺序转换created_at。乘以 -1 是不行的。所以试试吧。还请将 sysdate 替换为其 mysql 等效项。

           select  orders.status, orders.created_at FROM orders
           ORDER BY
            CASE 
            WHEN (orders.status='new' or orders.status='processing') 
            THEN created_at end,
            case when orders.status='other' then (sysdate - created_at) 
          END;
    

    输出

          STATUS        CREATED_AT          
          processing    20-AUG-2015 22:11:24
          processing    30-AUG-2015 22:11:24
          new           30-AUG-2015 22:11:24
          new           09-SEP-2015 22:11:24
          other         10-AUG-2015 22:11:24
          other         31-JUL-2015 22:11:24
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      • 2011-01-16
      相关资源
      最近更新 更多