我正在尝试执行一个sql,它在分组时间段后检索开始时间和行数。我已经在stackoverflow上检查过了,我可以实现
GROUP BY UNIX_TIMESTAMP(time_stamp) DIV 30
问题在于我需要从一定时间开始(它可能存在或可能不存在于行之间)甚至(如果可能 - 不需要考虑)添加0计数项目的时间。
例如,有一个包含此行的表:
+---------------------+-----------------+
| time_stamp | id |
+---------------------+-----------------+
| 2010-06-15 23:00:04 | 1 |
| 2010-06-15 23:00:30 | 2 |
| 2010-06-15 23:01:30 | 3 |
| 2010-06-15 23:03:30 | 4 |
| 2010-06-15 23:04:30 | 5 |
| 2010-06-15 23:06:10 | 6 |
| 2010-06-15 23:06:20 | 7 |
| 2010-06-15 23:06:30 | 8 |
| 2010-06-15 23:06:30 | 9 |
| 2010-06-15 23:06:35 | 10 |
+---------------------+-----------------+
从2010-06-15 23:00:00开始每分钟(DIV 60),我想得到以下输出:
+---------------------+-----------------+
| time_stamp | count(id) |
+---------------------+-----------------+
| 2010-06-15 23:00:00 | 2 |
| 2010-06-15 23:01:00 | 1 |
| 2010-06-15 23:02:00 | 0 |
| 2010-06-15 23:03:00 | 1 |
| 2010-06-15 23:04:00 | 1 |
| 2010-06-15 23:05:00 | 0 |
| 2010-06-15 23:06:00 | 5 |
+---------------------+-----------------+
。即使没有count = 0的情况也会很酷。
此外..添加每个时间戳然后删除它不是一个解决方案..
这些是虚拟数据,我不想仅按分钟划分,而是通过php
中的参数划分可以找到正确的答案here,但我只能通过标记为已接受的帖子找到答案。
答案 0 :(得分:1)
你要做的就是GROUP BY,然后使用时间函数..在这种情况下,MINUTE应该做你想做的事情
SELECT COUNT(*) FROM table
GROUP BY MINUTE(time_stamp)
修改强>
在编辑问题之后我相信这个查询将更接近您想要做的事情。
SELECT
FROM_UNIXTIME
( FLOOR(UNIX_TIMESTAMP(`time_stamp`)/your_var
)* your_var
) AS timesliced,
COUNT(*) AS mycount
FROM tablename
WHERE time_stamp >= '2010-06-15 23:01:45'
GROUP BY timesliced