4

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

我可能想做这样的事情:

(SELECT * FROM events WHERE date > NOW() ORDER BY date ASC)
UNION
(SELECT * FROM events WHERE date < NOW() ORDER BY date DESC)

我检查了 MySQL 文档,发现 UNION 通常适用于无序的行集,因此对每个 SELECT 进行排序是毫无用处的。UNION ALL 似乎都没有完成这项工作。

在谷歌搜索了一下之后,我知道如何根据 SELECT 生成的行对行进行排序,但是,我仍然不知道如何按不同的顺序按同一列对它们进行排序。

我想我可以很好地执行两个 SELECT,一个用于即将发生的事件,一个用于过去的事件。但我真的想知道是否有可能只用一个查询来做到这一点。
你有什么可以建议的吗?

4

2 回答 2

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部分ORDER BY确保即将发生的事件首先出现,并确保过去的事件以所需的顺序显示,但不影响即将发生的事件的相对顺序。该date ASC部分是处理该部分的后备标准。

(免责声明:未经测试。)

于 2012-09-04T18:00:04.540 回答
0

To answer the more general question, the UNION operation is not guaranteed to preserve any order of any retrieved rows. To get rows returned in a specific order, the only guarantee you have is to use an ORDER BY clause on the query (the outermost SELECT statement).

于 2012-09-04T18:26:48.780 回答