我有一个带有日期列的简单事件表。我可以轻松选择 接下来的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/