2012-04-11 50 views
0

這個問題與我以前的問題 - MySQL query to show records with current date on top and others as per descending orderMySQL查詢命令記錄ORDER BY

- 我現在用的是,

SELECT b.sales_id,b.category_id,b.sale_starts,b.sale_ends 
FROM tbl_sales b WHERE b.active=1 
UNION 
SELECT b.sales_id,b.category_id,b.sale_starts,b.sale_ends 
FROM tbl_sales b INNER JOIN tb_category c ON b.category_id=c.cat_id 
WHERE c.cat_keyword LIKE 'a' 
ORDER BY IF(sale_ends = DATE(NOW()), 0, 1), sale_ends DESC 

和返回的結果如下,

sales_id  | category_id   |sale_starts | sale_ends 
    ----------|---------------------|------------|-------------- 
    4  | 12    | 2012-04-05 | 2012-04-11 (today's date) 
    1  | 10    | 2012-03-31 | 2012-04-30  
    2  | 11    | 2012-03-22 | 2012-04-27 
    3  | 25    | 2012-03-31 | 2012-04-25 
    5  | 18    | 2012-04-05 | 2012-04-09 
    6  | 20    | 2012-02-23 | 2012-02-27 
    7  | 14    | 2012-02-25 | 2012-02-26 

但現在我堅持的另一個問題,我需要對記錄進行排序如下所示的查詢

sales_id  | category_id   |sale_starts | sale_ends 
     ----------|---------------------|------------|-------------- 
     4  | 12    | 2012-04-05 | 2012-04-11 (today's date) 
     3  | 25    | 2012-03-31 | 2012-04-25 
     2  | 11    | 2012-03-22 | 2012-04-27 
     1  | 10    | 2012-03-31 | 2012-04-30 
     7  | 14    | 2012-02-25 | 2012-02-26 (expired/past dates) 
     6  | 20    | 2012-02-23 | 2012-02-27 
     5  | 18    | 2012-04-05 | 2012-04-09 

我曾嘗試在查詢中使用ASC而不是DESC,但過期日期僅在今天的日期之後列出。我需要在今天的日期之後列出未來的日期,之後纔會列出過期的日期。這如何實現?

需要幫助。在此先感謝

回答

3

ORDER BY將按從左到右的順序處理每個條件。所以,如果你需要的順序是一樣的東西「與今天的日期的條目,那麼任何在未來日期的升序條目,在日期的升序那麼其他條目」你可以做這樣的事情

ORDER BY (sale_ends=CURDATE()) DESC,(sale_ends>CURDATE()) DESC,sale_ends ASC 

前兩個被列爲DESC的原因是條件將評估爲1,如果爲真,則爲0。由於您首先需要真實條件,因此您需要按照DESCending順序對它們進行排序。

+0

再次感謝您的目的。 – 2012-04-11 08:40:26

1

我可能會誤解某些東西,但是這不是你要找的東西嗎?

order by sale_ends < curdate(), sale_ends 

小提琴here

+0

謝謝你的嘗試 – 2012-04-11 08:41:01