0

私は2つのテーブルを持っています(実際にはもっとたくさんありますが、それは問題ではありません):

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

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

sourcewebsiteテーブルには、いくつかのsourcewebsiteが含まれ、offlinethresholdは、Webサイトがオフラインであることが許可されている時間を示します。

sourcewebsite_updatelogテーブルは、sourcewebsiteがチェックされるたびに新しいエントリで埋められるログテーブルです。'episodestotal'が0の場合、チェックが行われたときにWebサイトがオフラインであったことを意味します。

私が今欲しいのはこれです:私は彼らのofflinethresholdを超えたすべてのウェブサイトのリストが欲しいです。したがって、ID 1のソースWebサイトがあり、オフラインしきい値が6時間であると仮定します。このWebサイトが過去6時間に5回チェックされたと仮定しますが、チェックされるたびに「episodestotal」は0でした。これは、このWebサイトがしきい値を超えたため、オフラインと見なすことができることを意味します。

過去6時間オフラインになっているすべてのソースWebサイトを特定するための小さなSQLクエリを思いつきましたが、問題は、これらの「6時間」がハードコーディングされていることです。各ソースWebサイトの「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-2715: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 に答える