2016-03-17 33 views
2

我试图创建一个查询发现,具有小于20分钟老查询的记录,其中存在具有最大(日)

这是一个心跳的日期至少一个记录线程表看起来像这样:

+--------------+-----------+---------------------+---------------------+ 
| heartbeat_id | server_id | thread    | last_checkin  | 
+--------------+-----------+---------------------+---------------------+ 
|   3 |  133 | EscalationMonitor | 2016-03-16 23:46:07 | 
|   7 |  133 | EmailMonitor  | 2016-03-16 23:47:31 | 
|   11 |  133 | TableMonitor  | 2016-03-16 23:42:49 | 
|   15 |  133 | NotificationMonitor | 2016-03-16 23:46:30 | 
|   19 |  127 | EmailMonitor  | 2016-03-16 23:47:21 | 
|   23 |  127 | TableMonitor  | 2016-03-16 23:46:11 | 
|   27 |  127 | EscalationMonitor | 2016-03-16 23:47:58 | 
|   31 |  127 | NotificationMonitor | 2016-03-16 23:41:10 | 
|   35 |  123 | EmailMonitor  | 2016-03-16 23:47:59 | 
|   39 |  123 | TableMonitor  | 2016-03-16 23:43:10 | 
|   43 |  123 | EscalationMonitor | 2016-03-16 23:46:26 | 
|   47 |  123 | NotificationMonitor | 2016-03-16 23:46:47 | 
+--------------+-----------+---------------------+---------------------+ 

这是我在哪里,但这种搜索至少一个记录超过20分钟岁。

SELECT * FROM heartbeat h WHERE exists 
(
    select * from heartbeat h2 
    where last_checkin < date_add(now(), INTERVAL - 20 MINUTE) 
) 
group by thread 
+0

remove从'间隔除去-'-' - 20 MINUTE' – Saif

+0

这将意味着在未来last_checkin <20分钟... ...对吧? – JonasJSchreiber

+0

不,它会比创建日期的20分钟更早 – Saif

回答

2

如果你想有至少1签了20多分钟前线程,你可以把这个条件在where子句中,并使用不同的删除重复:

select distinct thread from heartbeat 
where last_checkin > date_sub(now(), INTERVAL 20 MINUTE) 

要检索的所有主题有未签到不到20分钟的时候:

select thread from heartbeat 
group by thread 
having count(case when last_checkin > date_sub(now(), INTERVAL 20 MINUTE) then 1 end) = 0 

如果你有一个threads表,那么你可以利用not exists

select * from threads t where not exists (
    select 1 from heartbeat h 
    where t.thread = h.thread 
    and h.last_checkin > date_sub(now(), INTERVAL 20 MINUTE) 
) 
+0

我想要至少有一个签​​入少于20分钟的线程。换句话说,我希望线程没有超过20分钟的checkins。 (实际上,这将是一个监控cron,如果结果集中有记录,将会调用警报,因此“没有少于20分钟的记录”将是正确的方式。) – JonasJSchreiber

+0

@JonasJSchreiber更新了查询但这些不一样。假设一个线程在15分钟前和40分钟前都有签入。这将满足第一条标准,但不是第二条标准。 – FuzzyTree

+0

Yeeeess,那个查询“有count(...)= 0”是我正在寻找的那个。谢谢@FuzzyTree – JonasJSchreiber

0

INTERVAL - 20 MINUTE

+0

这并没有提供一个问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 - [来自评论](/ review/low-quality-posts/11661682) –

+0

我已经提供了他的问题的技巧,并在评论中解释它,然后模糊已经使用我的技巧来重新纠正他的第一个答案 – Saif

+1

它需要date_sub for那工作。我认为,date_add(now(),interval - 20分钟)与date_sub(now(),interval 20分钟)是同义的。 – JonasJSchreiber

相关问题