2016-10-31 5 views
0

私はデータベースとしてMySQLを、スクリプト言語としてPHPを使用しているレポート作成プログラムを作成しています。by unixタイムスタンプ+24時間

私がしようとしているのは、レコードを時間でグループ化し、結果セットで過去24時間のうちにグループ化することです。

現在のクエリ

SELECT count(*),time FROM `service_data` GROUP BY time 

上記のクエリは、結果では一緒に最後の24時間、それだけのグループと同様のunixtimestampでグループにそれらを

テーブル構造

CREATE TABLE IF NOT EXISTS `service_data` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `service_id` varchar(255) NOT NULL, 
    `ip_address` varchar(255) NOT NULL, 
    `time` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ; 

ありません特定の時間にレポートがない場合、24レコードがnullになるように設定する。そう

| hour | reports | 
|------|----------| 
| 1 | 5  | 
| 2 | 10 | 
| 3 | 12 | 
| 4 | 25 | 

同様

すべてのヘルプははるかに高く評価されます!

ありがとうございます!

UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY)) 

HOURを使用し、その後、最初の時間に変換し、バック時にタイムスタンプを変換するには:、最後の24時間を取得し、UNIXタイムスタンプに1日前の時間を変換する

+0

時 'int'で保存していない理由'タイムスタンプ'? –

+0

私はちょうどそれの地獄のためにタイムスタンプを挿入するためにPHPを使用しているので。 – Moe

+0

は時間現在のUNIXのタイムスタンプですか? – barudo

答えて

1

機能:これらを組み合わせる

HOUR(FROM_UNIXTIME(time)) 

、あなたが行うことができます:

SELECT HOUR(FROM_UNIXTIME(time)) AS hour, COUNT(*) 
FROM service_data 
WHERE time >= UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY)) 
GROUP BY hour 

テーブルIの場合非常に大きい場合は、time列にインデックスを追加してください。フルスキャンを行う必要はありません。

データがない時間の結果を得るために、あなたはすべての時間の番号を含むテーブルでLEFT JOINを使用する必要があります:

SELECT t1.hour, COUNT(s.id) AS reports 
FROM (SELECT 0 AS hour UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 ... UNION SELECT 23) AS t1 
LEFT JOIN service_data AS s 
ON t1.hour = HOUR(FROM_UNIXTIME(s.time)) AND s.time >= UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY)) 
GROUP BY t1.hour 
ORDER BY t1.hour 
+0

1日= 24時間であるとは限りません。 – apokryfos

+0

24時間でない日はいつですか? – Barmar

+0

この兄弟のおかげで – Moe

関連する問題