0

我有两张桌子(实际上我还有很多,但这没关系):

sourcewebsite:
id - int (PK)
name - varchar
offlinethreshold - int

sourcewebsite_updatelog:
id - int (PK)
sourcewebsiteid - int (FK)
datetime_start - datetime
episodestotal - int

sourcewebsite 表包含几个 sourcewebsites,带有一个表示允许网站离线的小时数的离线阈值。

sourcewebsite_updatelog 表是一个记录表,每次检查 sourcewebsite 时都会填充一个新条目。如果 'episodestotal' 等于 0,则表示检查发生时网站处于离线状态。

我现在想要的是:我想要一个所有超出其离线阈值的网站的列表。因此,假设我们有一个 ID 为 1 的源网站,并且离线阈值为 6 小时。假设在过去 6 小时内对该网站进行了 5 次检查,但每次检查时,“episodestotal”为 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 小时内每次都处于离线状态,因此必须将其标记为离线。

频道 3 在过去 10 小时内已在线 1 次,所以没关系。不需要标志。

谁能帮我?

4

2 回答 2

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`

所以你可以看到我的回答中的哪一点没有按照我的想法做。

于 2012-09-24T21:40:37.683 回答
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

不太难,我只需要使用另一个函数进行日期减法。

于 2012-09-27T21:19:11.390 回答