MySQL Sort by Date Where Date >= Today 首先升序,然后 Date < Today 在 1 Query 中降序

标签 mysql sql sql-order-by

我试过

SELECT *
FROM `activity`
WHERE 1
ORDER BY
    CASE WHEN `activity_date` >= '2019-06-14' THEN `activity_date` END ASC,
    CASE WHEN `activity_date` < '2019-06-14' THEN `activity_date` END DESC,
    `activity_date` ASC

但它给了我 2019-06-14 之前的降序排列,等于或晚于 2019-06-14 的升序排列。喜欢

+----+------------+
| ID | Date       |
+----+------------+
| 5  | 2019-06-12 |
| 3  | 2019-06-11 |
| 2  | 2019-06-10 |
| 4  | 2019-06-15 |
| 1  | 2019-06-16 |
+----+------------+

目前我将它分成 2 个查询以确保它可以使用 WHERE 子句返回正确的顺序。

但是,当我需要在许多页面中列出结果时,我不能使用 LIMIT start_limit, items_per_page,因为它们有自己的行数。

如果我使用 UNION 合并结果,顺序将再次不正确。因此,如果我可以使用 1 个查询并且它可以返回正确的顺序,那就太好了!

最佳答案

这是编写 ORDER BY 子句的更简洁的方法:

SELECT ID, Date
FROM activity
ORDER BY
    Date < '2019-06-14',
    IF(Date >= '2019-06-14', 1, -1) * DATEDIFF(Date, '2019-06-14');

第一个排序级别将 2019-06-14 或之后的记录放在第一位,然后是较早的记录。然后,在这两个组中的每一组中,我们对较晚的记录进行升序排序,对较早的记录进行降序排序。

enter image description here

Demo

适用于任何数据库的更通用的解决方案(保存 DATEDIFF,这是 MySQL 特定的):

ORDER BY
    CASE WHEN Date < '2019-06-14' THEN 1 ELSE 0 END,
    (CASE WHEN Date >= '2019-06-14' THEN 1 ELSE -1 END) *
     DATEDIFF(Date, '2019-06-14');

关于MySQL Sort by Date Where Date >= Today 首先升序,然后 Date < Today 在 1 Query 中降序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57584630/

相关文章:

php - MYSQL 出现重复错误

sql - 选择递归并排序

Mysql - 从复杂的标准中获取结果

mysql - SQL:如何使用 DISTINCT 保持行顺序?

mysql - 按 SQL 查询排序

php - 如何跨多个类访问PDO连接对象?[php +Mysql]

mysql - Redis 排序 : How do I sort a redis hash key by given value?

MySQL 准备语句 nvarchar

sql - 具有基于滞后条件的 Oracle SQL ROW_NUMBER() 窗口

mysql - 使用 GROUP BY 后元素顺序困惑