我想按如下方式对记录进行排序:
首先是今天,然后是明天,直到没有更多的未来记录。 然后我想展示过去的事件,但是最新的事件。
到目前为止,我找到了第一点的解决方案:
ORDER BY (
CASE WHEN ev.StartDate < CURDATE()
THEN 1
ELSE 0
END) ASC, ev.StartDate ASC
但是这个查询的问题是所有帖子都是ASC订购的,包括过去的帖子(需要DESC)。
如何在CASE
?
答案 0 :(得分:9)
您需要稍微复杂一点order by
:
ORDER BY (ev.StartDate < CURDATE()),
(case when ev.StartDate > CURDATE() then ev.StartDate end) ASC,
(case when ev.StartDate < CURDATE() then ev.StartDate end) DESC
你实际上可以用两个子句来做到这一点:
ORDER BY greatest(ev.StartDate, CURDATE()) DESC,
least(ev.StartDate, CURDATE()) ASC
但我认为第一个版本的意图更清晰。
答案 1 :(得分:1)
ORDER BY
CASE WHEN (CURDATE() > ev.StartDate)
THEN datediff(CURDATE(),ev.StartDate ) --Past, older date bigger differ
ELSE datediff(ev.StartDate , CURDATE()+100) END --Future, differ from a more futrue date
答案 2 :(得分:1)
我发现这是最直接的,无需复杂的条件语法:
第一个排在未来之前,第二个排序未来的ASC,第三个排序过去的DESC
(第二个和第三个可以互换)
ORDER BY
(date < CURDATE()) ASC,
(greatest(date, CURDATE()) ASC,
(least(date, CURDATE()) DESC
答案 3 :(得分:0)
我有相同的要求并找到了另一种方式
ORDER BY (CURDATE()>ev.StartDate) ASC, ABS(DATEDIFF(CURDATE(),ev.StartDate))