我正在做一个mysql查询来计算每分钟的条目数并绘制结果图。结果输出仅显示金额不为零的时间戳。这导致我的图形提供不正确的结果作为在两点之间划线的时间间隙。我想返回每分钟和值的数量。
有没有办法构建此查询而无需循环并执行多个查询?或者,如果我需要一个循环,有一种简单的方法可以在两个时间戳之间循环每一分钟吗?
这是我的疑问:
SELECT UNIX_TIMESTAMP(timestamp) AS timestamp, count(*) AS total
FROM table
WHERE timestamp <= '2011-04-22 11:00' AND timestamp >= '2011-04-20 10:00'
GROUP BY MINUTE(timestamp)
答案 0 :(得分:0)
您要做的是使用“计数”或“数字”表。基本上,您创建一个具有一个整数列的表,其中数字从1递增到非常高的数字。因此,如果计数表有1000条记录,则表中的数字从1到1000。你想要把更多的数字放在1000以上,但希望你能得到这个想法。
获得计数表后(单击here获取脚本),您可以在查询中选择numtablevalue
介于1和enddate - startdate
之间(以分钟为单位)。然后按startdate + numtablevalue
分组。
这样的事情(伪SQL)应该有效:
SELECT 'startdate' + INTERVAL tt.id MINUTE, COUNT(t1.timestampfield)
FROM tallytable AS tt
INNER JOIN
table AS t1
ON 'startdate' + INTERVAL tt.id MINUTE = t1.timestampfield
WHERE
tt.id BETWEEN 1 AND GETMINUTES('enddate' - 'begindate')
GROUP BY 'startdate' + INTERVAL tt.id MINUTE
基本上我们选择的数字从1到两个日期之间的秒数。然后我们使用startdate + tt.id
来获取日期之间的每一秒。然后我们加入并对其进行分组,以查找t1
中使用数字表选择的每分钟记录的数量。我希望这是有道理的。
您可能需要注意以下几点:
5:12 PM
可能不等于5:12:30 PM
答案 1 :(得分:0)
select i.`minute`,count(minute(timestamp)) as total from (
select tmp.digit + tmp2.digit * 10 as `minute`
from (
select 0 as digit union all
select 1 union all
select 2 union all
select 3 union all
select 4 union all
select 5 union all
select 6 union all
select 7 union all
select 8 union all
select 9
) as tmp
cross join (
select 0 as digit union all
select 1 union all
select 2 union all
select 3 union all
select 4 union all
select 5
) as tmp2 ) as i
left join table
on minute(tb.timestamp) = i.`minute`
and timestamp between '2011-04-20 10:00' and '2011-04-22 11:00'
group by i.`minute`
此查询将为您提供60条记录(从0到59的分钟数),每分钟的总数不会创建另一个表来存储整数值。