2017-03-17 105 views
0

我试图通过积极活动先订购我的表,然后是“endDate”。这意味着,新创建的广告系列将始终排在最后,然后是日期。当广告系列结束时,我希望最新的“endDate”位居第一。MySQL先订购“ID”,然后通过“日期”

这里是我下面的查询:

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

看下面的截图,一些没有被“结束日期”命令(高亮红色框) enter image description here

,第一部分是正确的,这意味着“endDate”还没有结束,并且首先按id排序。但是,最后一部分是错误的,已结束的广告系列应该按照“endDate”进行排序。我哪里错了?

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

+0

请在http://sqlfiddle.com上创建一个小提琴,其中包含表结构和示例数据以及问题的预期结果。 –

+0

它被创建...请再次检查 – nodeffect

回答

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

这应该工作。

基本上你不需要>条件依次。

如果你想要过滤日期大于当前日期,那么它应该在哪里条件。

+0

我试过这个,它不工作也 – nodeffect

+0

你可以给sqlfiddle的例子吗? – Akshay

+0

添加上面,请看看,并忽略WHERE删除='假' – nodeffect

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子句中。但是,对于小数据集无关紧要。

+0

我试过了上面提供的查询,它是不工作,它只是排序结束日期。 – nodeffect

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 
+0

要标记此问题已解决,请点击您最喜欢的答案旁边的勾号图标。如果您愿意,可以自行选择答案。 – halfer