簡體   English   中英

MySQL按順序排序

[英]MySQL order by with condition

訂單表包含列: 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;

也行不通。

你可以用這個:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM