我有两个表(实际上我有更多,但这无关紧要):
sourcewebsite:
id - int (PK)
name - varchar
offlinethreshold - int
sourcewebsite_updatelog:
id - int (PK)
sourcewebsiteid - int (FK)
datetime_start - datetime
episodestotal - int源网站表包含两个源网站,其中离线压力表示允许网站离线的小时数。
sourcewebsite_updatelog表是一个日志记录表,每次检查源网站时都会填充一个新条目。如果“episodestotal”等于0,则表示检查发生时网站处于离线状态。
我现在想要的是:我想要一份所有网站的列表,这些网站超出了他们的下线范围。因此,假设我们有一个ID为1的源网站,离线时间为6小时。让我们假设这个网站在过去的6个小时内被检查了5次,但每次检查时,“事件”都是0。这意味着这个网站超过了它的阈值,因此可以被认为是离线的。
我想出了一个小的SQL查询来确定过去6小时内所有离线的源网站,但问题是这“6小时”是硬编码的。我想对每个源网站使用“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小时内每次都处于离线状态,因此必须将其标记为离线。
在过去的10个小时内,频道3已经在线了1次,所以没问题。不需要标志。
有谁可以帮我?
发布于 2012-09-28 05:19:11
耶,看起来我终于得到了正确的查询。这是我想出来的:
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不是很难,我只需要使用另一个函数进行日期减法。
发布于 2012-09-25 05:40:38
我不确定我是否完全理解您的意思,但是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`所以你可以看到我的答案中有哪一点没有像我想的那样做。
https://stackoverflow.com/questions/12572899
复制相似问题