2016-10-31 45 views
0

我在寫一個報告程序,它使用MySQL作爲數據庫和php作爲腳本語言。group by unix timestamp + by 24 hours

我想要做的是按時間對記錄進行分組,並將它們在結果集中最近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個記錄如果在特定小時內沒有報告爲空。

像這樣

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

任何幫助將非常感激!

謝謝!

+0

爲什麼時間存儲在'int'而不是'timestamp'? –

+0

,因爲即時通訊使用PHP來插入時間戳只是爲了它。 – Moe

+0

是時間當前unix時間戳嗎? – barudo

回答

1

要獲得過去24小時內,轉換的1天前的時間到UNIX時間戳:

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

要時間戳轉換回一個小時,先將其轉換爲一個時間,然後使用HOUR功能:

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 

如果表我非常大,請在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