2015-09-19 67 views
3

存在帶列的訂單表:status,created_at 狀態列具有值:new,processing,other。MySQL根據條件排列

問題是選擇所有訂單,首先在狀態處理之後選擇狀態爲新的訂單,然後選擇所有訂單。 新的加工訂單應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; 

不工作過。

回答

0

這是工作在甲骨文。請檢查它是否也適用於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 
1

您可以使用此:

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。 當狀態處於('新','處理')時,第一種情況將返回將按照升序排列的創建日期,否則爲空。 當狀態不在('新','處理')時,第二種情況將返回將按降序創建的日期。

+0

@ lad2025我認爲運首先要對新訂單,然後用狀態的處理,那麼所有的人,你的情況下,當將第一次把加工訂單。一個'FIELD(狀態,'處理','新')DESC'可以替代,我喜歡兩條線,但我會嘗試哪一個更好 – fthiella