MySQL - 不同的部分ORDERING(基于时间)

时间:2014-12-16 00:04:33

标签: php mysql sql

所以我在我的网站上有一个事件列表,有些是将来的,有些是过去的。

问题是,我想应用不同的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:)

2 个答案:

答案 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

希望这会有所帮助。