MySQL按顺序排序

时间:2015-09-19 16:14:44

标签: mysql sql sql-order-by

订单表中包含以下列:statuscreated_at 状态列具有值:new,processing,other。

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

例如尝试结合union two选择,但结果是union忽略了内部查询中的选择顺序。

或其他变体:

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;

也行不通。

2 个答案:

答案 0 :(得分:4)

您可以使用:

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。 如果状态不在('新','处理'),则第二种情况将返回将按降序排列的创建日期。

答案 1 :(得分:0)

这在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