0

非常に単純なMySQLテーブルがあります

Name  |  Time  |  Count
James |  11:00 |  10
Simon |  11:00 |  5
James |  11:30 |  4
Oliver|  11:30 |  2
James |  12:00 |  1
etc.

各人のカウントを合計し、過去 1 時間の値、過去 3 時間の値、過去 6 時間の値、過去 12 時間の値、および過去 24 時間の値を出力する MySQL クエリを作成したいと考えています。

たとえば、時刻が現在 12:59 の場合、上記の表は次のように出力します。

Name  |  Last-1  |  Last-3  | Last-6
James |  1       |  15      | 15
Simon |  0       |  5       | 5
Oliver|  0       |  2       | 2

単一のクエリでこれを行うことは可能ですか? これまでのところ、私は持っています:

SELECT name, HOUR( NOW( ) ) - HOUR( time ) AS lasthours, SUM( count ) AS c
FROM table
GROUP BY name, lasthours
HAVING lasthours =0
ORDER BY c DESC

過去 1 時間はわかりますが、追加の列を取得するにはどうすればよいですか?

どんな助けでも大歓迎です。

編集:

受け入れられた答えは少し調整する必要があり、次のようになりました。

SELECT  name , 
        SUM( IF( HOUR( TIMEDIFF( NOW( ) ,  time ) ) <=0,  count , 0 ) ) AS  `Last hour` ,
        SUM( IF( HOUR( TIMEDIFF( NOW( ) ,  time ) ) <=3,  count , 0 ) ) AS  `Last 3 hours` ,
        SUM( IF( HOUR( TIMEDIFF( NOW( ) ,  time ) ) <=6,  count , 0 ) ) AS  `Last 6 hours` ,
        SUM( IF( HOUR( TIMEDIFF( NOW( ) ,  time ) ) <=12,  count , 0 ) ) AS  `Last 12 hours` ,
        SUM( IF( HOUR( TIMEDIFF( NOW( ) ,  time ) ) <=24,  count , 0 ) ) AS  `Last 24 hours` ,
        SUM( IF( HOUR( TIMEDIFF( NOW( ) ,  time ) ) <=48,  count , 0 ) ) AS  `Last 2 days` ,
        SUM( IF( HOUR( TIMEDIFF( NOW( ) ,  time ) ) <=72,  count , 0 ) ) AS  `Last 3 days` ,
        SUM( IF( HOUR( TIMEDIFF( NOW( ) ,  time ) ) <=96,  count , 0 ) ) AS  `Last 4 days` ,
        SUM( IF( HOUR( TIMEDIFF( NOW( ) ,  time ) ) <=120,  count , 0 ) ) AS  `Last 5 days` ,
        SUM( IF( HOUR( TIMEDIFF( NOW( ) ,  time ) ) <=144,  count , 0 ) ) AS  `Last 6 days` ,
        SUM( IF( HOUR( TIMEDIFF( NOW( ) ,  time ) ) <=168,  count , 0 ) ) AS  `Last week`
FROM  table
GROUP BY  name
ORDER BY `Last hour` DESC
4

2 に答える 2

2
SELECT   `name`,
         SUM(IF(HOUR(TIMEDIFF(CURTIME(), `Time`)) <= 1, `Count`, 0)) AS `Last-1`,
         SUM(IF(HOUR(TIMEDIFF(CURTIME(), `Time`)) <= 3, `Count`, 0)) AS `Last-3`,
         SUM(IF(HOUR(TIMEDIFF(CURTIME(), `Time`)) <= 6, `Count`, 0)) AS `Last-6`
FROM     `table`
GROUP BY `name`

sqlfiddleで参照してください。

于 2012-06-29T11:40:38.803 に答える
1

これを試して

Select Name,Sum(Case When Hour(Now)-Hour(Time) <= 1 Then Count Else 0 End) As Last1,
Sum(Case When Hour(Now)-Hour(Time) Between 2 AND 3 Then Count Else 0 End) As Last3,
Sum(Case When Hour(Now)-Hour(Time) Between 4 And 6 Then Count Else 0 End) As Last6
From name
Order By 
于 2012-06-29T11:41:11.240 に答える