我有两张桌子(实际上我还有很多,但这没关系):
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 次,所以没关系。不需要标志。
谁能帮我?