如果未来不可用,则从未来或过去选择日期

eqqqjvef  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(372)

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

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

然而,并非所有人都会有3个事件在未来。在这种情况下,我想返回那些在未来可用的,并完成与今天最接近的丢失。e、 例如,如果今天是12-04日,则以下日期标有 * 应从整个列表中选择:

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

虽然我可以很容易地检查第一个查询的结果以找出返回了多少行,并在必要时构建另一个查询以查找过去的日期,但我很想知道是否有一种方法可以在单个查询中获取这些行。

baubqpgj

baubqpgj1#

可以在中使用多个键 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;

相关问题