2012-04-11 29 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