我有一列时间戳,我希望得到一个结果,我可以看到
added_on_this_date
)total_since_beginning
)我的表:
added
==========
1392040040
1392050040
1392060040
1392070040
1392080040
1392090040
1392100040
1392110040
1392120040
1392130040
1392140040
1392150040
1392160040
1392170040
1392180040
1392190040
1392200040
结果如下:
date | added_on_this_date | total_since_beginning
=========================================================
2014-02-10 | 4 | 4
2014-02-11 | 9 | 13
2014-02-12 | 4 | 17
我正在使用此查询,这会给我错误的结果
SELECT FROM_UNIXTIME(added, '%Y-%m-%d') AS date,
count(*) AS added_on_this_date,
(SELECT COUNT(*) FROM mytable t2 WHERE t2.added <= t.added) AS total_since_beginning
FROM mytable t WHERE 1=1 GROUP BY date
为了更好地理解,我创造了一个小提琴:http://sqlfiddle.com/#!2/a72a9/1
答案 0 :(得分:2)
你的混音时间戳和yyyy-mm-dd日期......
当你按yyyy-mm-dd分组时,你不确定知道将采用哪个时间戳。
你可以做到
SELECT FROM_UNIXTIME(added, '%Y-%m-%d') AS date,
count(*) AS added_on_this_date,
(SELECT COUNT(*) FROM mytable t2 WHERE FROM_UNIXTIME(t2.added, '%Y-%m-%d') <= FROM_UNIXTIME(t.added, '%Y-%m-%d')) AS total_since_beginning
FROM mytable t GROUP BY date
答案 1 :(得分:1)
使用变量比使用子查询更有效:
select date, added_on_this_date,
@cumsum := @cumsum + added_on_this_date as total_since_beginning
from (SELECT FROM_UNIXTIME(added, '%Y-%m-%d') AS date,
count(*) AS added_on_this_date
FROM mytable t
WHERE 1=1
GROUP BY date
) d cross join
(select @cumsum := 0) const
order by date;
编辑(回应评论):
上述查询具有显着的性能优势,因为它聚合了一次数据,这基本上是查询需要完成的所有工作。您可以使用适当的索引优化具有相关子查询的原始公式。不幸的是,一旦相关子查询中的条件在两个表上都使用了一个函数,那么MySQL将无法利用索引(通常)。
因为查询是按date
聚合的,所以这应该会更好。