mysql - 如果 future 不可用,请选择 future 或过去的日期

标签 mysql sql database date

我有一个带有日期列的简单事件表。我可以轻松选择 接下来的n个事件(假设n = 3):

SELECT * FROM events WHERE `date` > NOW() ORDER BY `date` LIMIT 3

但是, future 肯定会有 3 场事件。在这种情况下, 我想退回 future 可用的并完成现有的 与今天最亲近的人失踪了。例如,如果今天是 12-04 天, 应从整个列表中选择以下标有 * 的日期:

10-03
20-03
30-03 *
10-04 *
20-04 *

虽然我可以轻松检查第一个查询的结果以了解如何 返回了许多行并构建另一个查询来查找过去的日期 如果有必要,我很想知道是否有办法获取这些 单个查询中的行。

最佳答案

您可以在 order by 中使用多个键。所以:

SELECT e.*
FROM events
ORDER BY (date > now()) DESC,  -- future events first
         (CASE WHEN date > now() THEN date END) ASC -- nearest future events first
         date DESC  -- other dates in descending order
LIMIT 3;

如果您的表很大,那么从不久的将来和不久的过去获取三个事件并将它们组合起来可能会更快:

select e.*
from ((select e.*
       from events e
       where date > now()
       order by date asc
       limit 3
      ) union all
      (select e.*
       from events e
       where date <= now()
       order by date desc
       limit 3
      )
     ) e
order by date desc
limit 3;

关于mysql - 如果 future 不可用,请选择 future 或过去的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49807058/

相关文章:

sql - 数据库设计 : Stored Record Edit History (Temporal Data)

java - SQL转义遵循什么规则?

django - 将字段添加到 Django 的现有数据库中(版本 < 1.7)

android - 数据库中的数据太多

mysql - 哪些 SQL 注入(inject)方法不是 "destroyed"by mysql_real_escape_string();?

javascript - 仅当唯一时使用 knex 插入

mysql - 如何为带有 ORDER BY 子句的 SQL 查询选择正确的索引 (MySQL)

sql-server - 将 "null"或 NOT NULL 列添加到一个巨大的 SQL Server 表

mysql - 选择列 where 子句或如果没有条件则选择所有列

PHP 服务器在本应报告错误时超时