我有两张桌子(实际上我有更多,但这没关系):
sourcewebsite:
id - int (PK)
name - varchar
offlinethreshold - int
sourcewebsite_updatelog:
id - int (PK)
sourcewebsiteid - int (FK)
datetime_start - datetime
episodestotal - int
sourcewebsite表包含几个源网站,其中一个offlinethreshold指示允许网站离线的小时数。
sourcewebsite_updatelog表是一个日志表,每次检查sourcewebsite时都会填充一个新条目。如果'episodestotal'等于0,则表示检查发生时网站处于离线状态。
我现在想要的是:我想要一个超过其离线阈值的所有网站的列表。因此,我们假设我们有一个ID为1的sourcewebsite,以及6小时的离线阈值。假设在过去的6个小时内对此网站进行了5次检查,但每次检查时,“episodestotal”为0.这意味着该网站超出了其阈值,因此可以视为离线。
我提出了一个小的SQL查询来确定过去6小时内所有已脱机的源网站,但问题是这些“6小时”是硬编码的。我想使用每个sourcewebsite的'offlinethreshold'列中的值。
这是我到目前为止提出的查询:
SELECT `sourcewebsiteid`, `name`
FROM `sourcewebsite_updatelog`
JOIN `sourcewebsite`
ON `sourcewebsite_updatelog`.`sourcewebsiteid` = `sourcewebsite`.`id`
WHERE `datetime_start` > DATE_SUB(NOW(), INTERVAL 6 HOUR)
GROUP BY `sourcewebsiteid`
HAVING MAX(`episodestotal`) = 0
以下是一些示例数据:
sourcewebsite:
1 - channel 1 - 5
2 - channel 2 - 3
3 - channel 3 - 10
sourcewebsite_updatelog:
1 - 1 - 2012-09-27 12:03:05 - 1
2 - 2 - 2012-09-27 12:50:20 - 0
3 - 3 - 2012-09-27 12:51:11 - 1
4 - 1 - 2012-09-27 13:25:56 - 0
5 - 2 - 2012-09-27 13:48:34 - 0
6 - 3 - 2012-09-27 13:59:01 - 0
7 - 1 - 2012-09-27 14:23:53 - 1
8 - 1 - 2012-09-27 14:54:28 - 0
9 - 2 - 2012-09-27 15:11:40 - 0
我们假设我们在2012-09-27 15:30检查数据。通道1的阈值为5小时。它在过去的5个小时内(在12:03和14:23)已经在线2次,因此它不会被标记为“离线”。
频道2在过去3小时内每次都处于离线状态,因此必须将其标记为离线。
频道3在过去10小时内已经在线1次,所以没关系。不需要旗帜。
任何人都可以帮助我吗?
答案 0 :(得分:1)
不确定我是否完全得到你,但TimeDiff可能是你要走的路,比如
SELECT `sourcewebsiteid`, `name`
FROM `sourcewebsite_updatelog`
JOIN `sourcewebsite`
ON `sourcewebsite_updatelog`.`sourcewebsiteid` = `sourcewebsite`.`id`
WHERE (Time_to_sec(TimeDiff(Now(), `datetime_start`)) / 3600) >= `sourcewebsite`.`offlinethreshold`
GROUP BY `sourcewebsiteid`
没有mysql来测试它,你需要投射x / 3600甚至是它。
我不知道episodes_total是什么,但请尝试
SELECT `sourcewebsiteid`, `name`,
TimeDiff(Now(), `datetime_start`) as difftime,
Time_to_sec(TimeDiff(Now(), `datetime_start`)) as difftimesecs,
(Time_to_sec(TimeDiff(Now(), `datetime_start`)) / 3600) as difftimehours,
`oflinethreshold`,
max(`episodes_total`) as totalepisodes
FROM `sourcewebsite_updatelog`
JOIN `sourcewebsite`
ON `sourcewebsite_updatelog`.`sourcewebsiteid` = `sourcewebsite`.`id`
GROUP BY `sourcewebsiteid`
所以你可以看到我的答案中哪一点没有按照我的想法进行。
答案 1 :(得分:0)
是的,看起来我终于得到了正确的查询。这就是我想出的:
SELECT `sourcewebsiteid`, `name`
FROM `sourcewebsite_updatelog`
JOIN `sourcewebsite`
ON `sourcewebsite_updatelog`.`sourcewebsiteid` = `sourcewebsite`.`id`
WHERE HOUR(TIMEDIFF(NOW(), `sourcewebsite_updatelog`.`datetime_start`)) < `sourcewebsite`.`offlinethreshold`
GROUP BY `sourcewebsiteid`
HAVING MAX(`episodestotal`) = 0
不太难,我只需要使用另一个函数进行日期减法。