2011-09-10 6 views
2

これは恐らく非常に恥ずかしいほど簡単な質問ですが、私の心は今この時点で完全に止まっています。現在のタイムスタンプからMySQLの時間別内訳を生成する

私は別の人によって行わ活動の数、そしてそれはで行われた時間を格納するテーブルを持っている。

私は、パラメータとして人の名前を受け入れるレポートを作成したい、と示して現在のタイムスタンプ(now())から始まる前の24時間のそれぞれの間に、その人の1時間あたりの活動の数。今

任意の活動が存在したとき、

SELECT hour(TimeStamp), activities FROM tbl1 
WHERE timestamp >= DATE_SUB(NOW(), INTERVAL 24 HOUR) AND Name = ? 
GROUP BY hour(timestamp) 

は、私だけにそれらの時間を返します。しかし、私は活動がなかったときに0で完全な24時間の内訳をしたい。

つまり私は

Hour | No. of Activities 
1 | 34 
4 | 22 
9 | 86 

を取得していますが、私はこれを行うにはどうすればよい
Hour | No. of Activities 
1 | 34 
2 | 0 
3 | 0 
4 | 22 
5 | 0 
... etc. 

をしたいですか?

(例では時間の順序は関係ありません)

+0

を行うことができます。 – Shef

+0

現在の時刻が5:30とすると、最初の時間は4:30から5:30まで、または5から5:30になりますか? –

答えて

4

あなたはhourlyテーブルを作成し、あなたはおそらく、あなたのアプリケーションのロジックでこれを処理する必要がありLEFT JOIN

create table hourly 
(
    /* hour is not a reserved keyword */ 
    hour smallint(2) not null default 0 
); 

insert into hourly values (0),(1).... until 24 

SELECT 
    hourly.hour, 
    COALESCE(COUNT(activities),0) AS "No of Activities" 
FROM hourly 
LEFT JOIN tbl1 ON hourly.hour=hour(tbl1.TimeStamp) 
WHERE 
    tbl1.timestamp>=DATE_SUB(NOW(), INTERVAL 24 HOUR) AND 
    tbl1.Name=? 
GROUP BY hourly.hour 
ORDER BY hourly.hour; 
+0

これは良いアプローチです。素晴らしい回避策。 –

+0

@ajreal 申し訳ありませんが、何らかの理由でゼロを返すようにCOALESCE関数を取得できません。 '時刻を選択してください: 時間単位LEFT JOIN tbl1 ON時間単位。時間=時間(タイムスタンプ) タイムスタンプ> = DATE_SUB(NOW()、INTERVAL 24 HOUR)AND名前=? GROUP BY時間(タイムスタンプ) ORDER BY hourly.hour アクティビティが存在する時間だけが返されます。 –

+0

GROUP BYをhourly.hourに置き換えるのはどうですか? – ajreal