我有一张表格,存储有关某些事件的信息 我想列出这些事件,但我希望即将发生的事件先按升序显示,而过去的事件将按降序显示在下面。
我可能想做这样的事情:
(SELECT * FROM events WHERE date > NOW() ORDER BY date ASC)
UNION
(SELECT * FROM events WHERE date < NOW() ORDER BY date DESC)
我检查了MySQL doc并发现UNION通常使用无序的行集,因此对每个SELECT进行排序是没有用的。 UNION ALL似乎都没有做到这一点。
在谷歌搜索后,我知道如何根据SELECT生成它们来排序行,但是,我仍然不知道如何按不同的顺序按相同的列排序。
我想我可以很好地执行两个SELECT,一个用于即将发生的事件,一个用于过去的事件。但我真的很想知道只用一个查询就可以做到这一点 你能提出什么建议吗?
答案 0 :(得分:3)
我认为你不需要UNION
。你应该可以写:
SELECT *
FROM events
ORDER
BY CASE WHEN date < NOW() THEN date ELSE NOW() END DESC,
date ASC
;
CASE WHEN date < NOW() THEN date ELSE NOW() END DESC
的{{1}}部分可确保即将发生的事件,并确保过去的事件按所需顺序显示,但不会影响即将发生的事件的相对顺序。 ORDER BY
部分是处理该部分的后备标准。
(免责声明:未经测试。)
答案 1 :(得分:0)
要回答更一般的问题,UNION
操作不保证保留任何检索到的行的任何顺序。要获取按特定顺序返回的行,唯一的保证是在查询上使用ORDER BY
子句(最外面的SELECT语句)。