MySQL:保留UNION中的选择顺序

时间:2012-09-04 17:44:38

标签: mysql

我有一张表格,存储有关某些事件的信息 我想列出这些事件,但我希望即将发生的事件先按升序显示,而过去的事件将按降序显示在下面。

我可能想做这样的事情:

(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,一个用于即将发生的事件,一个用于过去的事件。但我真的很想知道只用一个查询就可以做到这一点 你能提出什么建议吗?

2 个答案:

答案 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语句)。