所以我在我的网站上有一个事件列表,有些是将来的,有些是过去的。
问题是,我想应用不同的ORDER,我认为最好用以下示例解释我的情况。让我们说我在页面上列出了事件列表,它给了我以下内容:
// Today's events:
A 17:00
B 19:00
C 20:00
// Yesterday's events:
D 21:00
E 18:00
F 09:00
正如您所看到的,当我获取6个事件时,我想对未来事件和过去事件应用不同的顺序。如果我正在考虑未来的事件,我最需要的事情是最早的事件,然后是稍后会发生的事件。
当我查看过去的事件时,我想要最新的事件(接近当前时间),然后是之前的事件(比当前时间更远)。
目前我正在进行两个查询(PHP),一个用于获取第一个X事件,如果我错过了一些事件以达到该限制X,我会再次查询数据库并获取一些过去的事件
这是两个查询,我想知道是否可以在一个查询中完成,我也可以设置偏移/限制(分页)。
更新: 我很抱歉没有把我的代码示例,我没有提出任何原因是因为SELECT语句非常简单。我有这样的事情:
SELECT id, title, datetime FROM events;
我在这里唯一可以添加的是我使用了两个语句,一个用于将来的事件,一个用于过去的事件(我将使用PHP逐个执行):
SELECT id, title, datetime FROM events WHERE datetime > NOW() ORDER BY datetime ASC;
对于过去的事件,我当然会使用
SELECT id, title, datetime FROM events WHERE datetime <= NOW() ORDER BY datetime DESC;
另外,我也提到过,我会执行第一个声明,如果总限制是10,而我只收到5个事件,那么我会执行第2个限制5的状态,只是为了达到我最初想要的10个事件
谢谢!
已解决,这是最终结果:
SELECT id, datetime, IF(datetime > NOW(), 1, 0) inFuture
FROM icm_event
ORDER BY inFuture DESC,
(CASE WHEN inFuture = 1 THEN datetime END) ASC,
(CASE WHEN inFuture = 0 THEN datetime END) DESC
谢谢Gordon Linoff:)
答案 0 :(得分:2)
您可以使用聪明的order by
:
select *
from table t
order by (eventdate = curdate()) desc, -- put today's events first
(case when eventdate = curdate() then eventtime end) asc, -- order today in ascending order
(case when eventdate <> curdate() then eventtime end) desc; -- order the rest in descending order
您没有提供有关表格结构的更多信息,但上述想法应该有效,尽管您的表格的详细信息可能有所不同。
答案 1 :(得分:1)
尝试两次使用select命令并使用&#34; Union All&#34;显示所有结果。
例如
Select * from (Select * from xxx where ... order by time ASC) as tb1
Union All
Select * from (Select * from xxx where ... order by time DESC) as tb2
希望这会有所帮助。