奇怪的MySQL查询破坏了我的大脑

时间:2016-03-09 19:49:40

标签: mysql

好的,我有两张桌子。一个是events,另一个是occursevent表是基本的,事件,它的ID,它的描述等...... occurs表使用事件ID链接到events表;它基本上是事件的时间表。例如,如果事件每周二发生,那么事件将在数据库中每个星期二晚上发生。

默认情况下,events表中的a行中没有任何时间戳,这些都在occurs表中。但是,出于某种原因,我需要获取events表的结果,并且还有一个时间戳。所以我想要做的是对events表使用查询,该查询链接到occurs表中的单行。我坚持的部分是要发生的事情。

如果事件在当前时间之后发生,我想简单地得到下一个即将发生的事件。但是,如果它是过去的事件,没有即将发生的事件,我希望得到最近的事件(最后一次)。

任何人都有关于如何完成这项工作的任何提示或提示?

2 个答案:

答案 0 :(得分:1)

一种方法是将occurs表加入两次,一次无条件并获得最大时间戳,一次以时间戳为条件>当前时间并获得最小时间戳。然后,如果第二个不是null,则使用否则使用第一个。

这不是真正的代码,只是一个快速的pseuodcode示例:

SELECT events.eventid,
  events.description,
  CASE WHEN MIN(ob.timestamp) IN NOT NULL THEN MIN(ob.timestamp) ELSE MAX(oa.timestamp) END AS timestamp
FROM events
  LEFT JOIN occurs oa ON events.id=oa.eventid
  LEFT JOIN occurs ob ON events.id=ob.eventid and ob.timestamp>Now()
GROUP BY events.eventid, events.description

答案 1 :(得分:-1)

试试这个:

create table events (id integer, descr varchar(20));
create table occurs (event_id integer, occur_date timestamp);
insert into events values (1, 'EV1');
insert into events values (2, 'EV2');
insert into occurs values (1, str_to_date('2016-03-09 05:40:00 AM','%Y-%m-%d %r'));
insert into occurs values (1, str_to_date('2016-03-09 08:40:00 AM','%Y-%m-%d %r'));
insert into occurs values (1, str_to_date('2016-03-09 11:40:00 AM','%Y-%m-%d %r'));
insert into occurs values (1, str_to_date('2016-03-09 05:40:00 PM','%Y-%m-%d %r'));
insert into occurs values (1, str_to_date('2016-03-09 06:40:00 PM','%Y-%m-%d %r'));
insert into occurs values (1, str_to_date('2016-03-09 07:40:00 PM','%Y-%m-%d %r'));
insert into occurs values (1, str_to_date('2016-03-09 09:40:00 PM','%Y-%m-%d %r'));
insert into occurs values (1, str_to_date('2016-03-09 10:40:00 PM','%Y-%m-%d %r'));
insert into occurs values (2, str_to_date('2016-03-09 05:34:00 AM','%Y-%m-%d %r'));
insert into occurs values (2, str_to_date('2016-03-09 08:34:00 AM','%Y-%m-%d %r'));
insert into occurs values (2, str_to_date('2016-03-09 11:34:00 AM','%Y-%m-%d %r'));
insert into occurs values (2, str_to_date('2016-03-09 02:34:00 PM','%Y-%m-%d %r'));

#solution
select e.id, e.descr, coalesce(min(o2.occur_date),max(o.occur_date)) as time_stamp, now()
from events e left join occurs o on e.id = o.event_id
left join occurs o2 on e.id = o2.event_id and o2.occur_date > now()
group by e.id, e.descr