我有一张 session 表,其中包含以下相关领域:
- session 名称(文本)
- 提交截止日期(日期)
- 通知日期(日期)
- 事件开始(日期)
- 事件结束(日期)
我想查询事件结束时间大于今天的所有 session ,并按如下方式排序:
- 首先,通知在未来的所有 session ;按通知日期订购这些。
- 然后,通知过去的所有 session ;在事件开始前订购。
我试过:
(SELECT * FROM conferences
WHERE ev_end >= '2014-06-30'
AND notification >= '2014-06-30'
ORDER BY notification ASC)
UNION
(SELECT * FROM conferences
WHERE ev_end >= '2014-06-30'
AND notification < '2014-06-30'
ORDER BY ev_start ASC);
但是不行,顺序不对。事实上,我根本看不出任何排序:当我省略两个 ORDER BY
子句时,结果以完全相同的方式排序(即,看起来是随机的)。
是否可以通过一个 SQL 查询来实现?还是我必须进行两个单独的查询?
我知道这个问题:Conditional sorting in MySQL? ,但我的情况完全不同。
最佳答案
您可以通过将所有逻辑放在 order by
子句中来使用单个查询来完成此操作:
select *
from conferences
where ev_end >= '2014-06-30'
order by (notification >= '2014-06-30') desc,
(case when notification >= '2014-06-30' then notification end) asc,
(case when notification < '2014-06-30' then ev_start end) asc;
请注意,union
明确不保证结果集的顺序。如果您想要以特定顺序排列的结果集,那么您需要在查询的最外层部分使用 order by
。
关于mysql - MySQL 中的条件排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24489100/