[英]MySQL order by with condition
訂單表包含列: 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;
也行不通。
你可以用這個:
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
請看看這個小提琴 。 當狀態為('new','processing')時,第一種情況將返回將按升序排序的創建日期,否則返回null。 當狀態不在('new','processing')時,第二種情況將返回將按降序排列的創建日期。
這在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.