2015-09-19 153 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