我试图通过积极的广告系列首先订购我的桌子,然后是" endDate"。这意味着,新创建的广告系列将始终排在最前面,然后是日期。当广告系列结束时,我想要最新的" endDate"在顶部。
以下是我的查询:
SELECT campaignId,
status,
dateCreated,
startDate,
endDate
FROM campaign
WHERE deleted='False'
ORDER BY DATE(endDate) > DATE(CURDATE()) DESC, campaignId DESC
查看下面的截图,有些不是由" endDate" (用红框突出显示)
第一部分是正确的,这意味着" endDate"避风港结束,先按身份排序。但是,最后一部分是错误的,结束的广告系列应按" endDate"进行排序。我做错了什么?
更新SQL小提琴(使用时请忽略WHERE deleted='False'
):http://sqlfiddle.com/#!9/0a7afb
答案 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