我正在编写一个报告程序,它使用MySQL作为数据库,php作为脚本语言。
我想要做的是按时间对记录进行分组,并在结果集中过去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 :(得分: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