mysql - MySQL 中的条件排序

标签 mysql sorting sql-order-by

我有一张 session 表,其中包含以下相关领域:

  1. session 名称(文本)
  2. 提交截止日期(日期)
  3. 通知日期(日期)
  4. 事件开始(日期)
  5. 事件结束(日期)

我想查询事件结束时间大于今天的所有 session ,并按如下方式排序:

  1. 首先,通知在未来的所有 session ;按通知日期订购这些。
  2. 然后,通知过去的所有 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/

相关文章:

sorting - 排序并保留具有最高值(value)的唯一副本

algorithm - 有线性时间复杂度O(1)辅助空间复杂度的排序算法吗?

mysql - 在一个查询中同时使用 GROUP BY 和 ORDER BY

oracle - 奇怪的 Oracle order By 对 String 的行为带有 * 和 (

sql - 在 doctrine 和 symfony 中将 '' 转换为 NULL

具有不同 WHERE 字段的 MySQL SELECT

javascript - 通过 typescript 中的 bool 属性对数组进行排序

mysql - 使用 MySql.Data;不支持 .NET Framework 4.6

php - MySQL 看似随机返回空集

linq - 如何在 Linq 中订购组结果?