订单表中包含以下列:status
,created_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;
也行不通。
答案 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