MySQL命令由" id"首先是" date"

时间:2017-03-17 10:03:50

标签: mysql

我试图通过积极的广告系列首先订购我的桌子,然后是" endDate"。这意味着,新创建的广告系列将始终排在最前面,然后是日期。当广告系列结束时,我想要最新的" endDate"在顶部。

以下是我的查询:

SELECT   campaignId, 
         status, 
         dateCreated, 
         startDate, 
         endDate 
FROM     campaign 
WHERE    deleted='False' 
ORDER BY DATE(endDate) > DATE(CURDATE()) DESC, campaignId DESC 

查看下面的截图,有些不是由" endDate" (用红框突出显示) enter image description here

第一部分是正确的,这意味着" endDate"避风港结束,先按身份排序。但是,最后一部分是错误的,结束的广告系列应按" endDate"进行排序。我做错了什么?

更新SQL小提琴(使用时请忽略WHERE deleted='False'):http://sqlfiddle.com/#!9/0a7afb

3 个答案:

答案 0 :(得分:1)

ORDER BY DATE(endDate) > DATE(CURDATE()) DESC表示未来的广告系列会先行。它没有说明在哪个顺序。将表达式添加到select子句中,您将看到。

您可以执行ORDER BY DATE(endDate) > DATE(CURDATE()) DESC, endDate DESC, campaignId DESC,但DATE(endDate) > DATE(CURDATE())表达式会使排序速度变慢并阻止使用索引。此外,您不必在日期列上执行DATE()

如果您想要未来广告系列和过去广告系列的单独列表,最好进行两次查询,将endDate条件放入where子句中。但是,对于小数据集而言并不重要。

答案 1 :(得分:0)

    SELECT 
     campaignId, status, dateCreated, startDate, endDate 
   FROM campaign 
   WHERE 
       deleted='False' 
   ORDER BY 
       DATE(endDate) DESC, campaignId DESC 

这应该有用。

基本上,您不需要> 条件。

如果您希望过滤器的日期大于当前日期,那么它应该处于where where条件。

答案 2 :(得分:0)

我通过使用“CASE”语句解决了这个问题。以防有人发现这个有用。

    SELECT 
     campaignId, status, dateCreated, startDate, endDate 
   FROM campaign 
   WHERE 
       deleted='False' 
   ORDER BY 
       CASE WHEN endDate > CURDATE() THEN campaignId END DESC, 
       CASE WHEN endDate < CURDATE() THEN DATE(endDate) END DESC