MySQL条件排序

gre*_*nif 4 mysql sql sql-order-by

有一个带有以下列的订单表: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;
Run Code Online (Sandbox Code Playgroud)

也不行。

fth*_*lla 5

您可以使用此:

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
Run Code Online (Sandbox Code Playgroud)

请看一下这个小提琴。当状态为(“新”,“正在处理”)时,第一种情况将返回升序排列的创建日期,否则返回null。当状态不在(“新”,“正在处理”)时,第二种情况将返回创建的日期,该日期将按降序排列。


Uts*_*sav 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;
Run Code Online (Sandbox Code Playgroud)

输出

      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
Run Code Online (Sandbox Code Playgroud)