gre*_*nif 4 mysql sql sql-order-by
有一个带有以下列的订单表:status,created_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)
也不行。
您可以使用此:
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。当状态不在(“新”,“正在处理”)时,第二种情况将返回创建的日期,该日期将按降序排列。
这是在 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)