从数据库group by 时间,查询count(1)

imindoor 发布于 2018/04/27 13:50
阅读 374
收藏 0

从数据库group by 时间,查询count(1),如果数据库数据为

id  |  create_time

1  |  2018-04-01  |  

2  |  2018-04-01  |  

3 |  2018-04-03  |  

一般group by create_time 结果是:

count  |  time

2  |  2018-04-01

1  |  2018-04-03

可以看出中间少了2018-04-02,

期望值

count  |  time

2  |  2018-04-01

0  |  2018-04-02

1  |  2018-04-03

这样的效果如何方便的实现,

考虑的关键点是时间间隔跨度 可能是 从2017-01-01 到 2018-04-27 每天的数据,求大神支招

加载中
0
MatchL
MatchL

找出当前的开始时间和结束时间,创建时间顺序的临时表,然后按时间字段关联。再group

MatchL
MatchL
回复 @imindoor : 推介临时表吧,存储过程不推荐,毕竟数据库是用来存储数据的,业务逻辑操作还是放到代码层面去。
imindoor
imindoor
创建临时表和存储过程 那个更推荐?
0
梦想岛
梦想岛

我只是建议:这个不应该生数据库生成吧,应该用程序来判断

imindoor
imindoor
后台代码二次封装也可以 ,你的建议我是懂得,我就想知道有没有比较好的便捷的方式
0
思念断叻弦
思念断叻弦

因为时间不连续所以根据时间分组会造成数据不全。
所以 在查询的时候 先用sql生成时间段范围内的日期 列表作为临时的数据集,然后查询数据库的数据 然后两个数据集做连接 即可;

mysql 生成一段时间内的连续时间(具体到某一天):
select date_add('2021-01-01',interval @i :=@i+1 day) as date from (select 1 union all select 1) p ,(select @i :=-1) as tmp;

生成一段时间内的连续的时间(天、月、年的类似):
SELECT DISTINCT * from (select date_format(date_add('2021-01-01',interval @i :=@i+1 day),'%Y-%m') as date from (select 1 union all select 1  union all select 1  union all select 1  union all select 1  union all select 1  union all select 1 ) p ,(select @i:=-1) as tmp) c;

只需要修改 date_formt 里面的时间格式即可 获取年、年-月、年-月-日

其中 临时表p 里面的 select 1 nuion all 的数量 可以通过php处理生成 然后去掉最后面的 nuion all 然后拼成sql 执行,但是 计算循环次数的时候 可以通过php 计算出两个日期之间相差的天数 然后在这个天数上+1 计算出循环的次数 然后就可以了

imindoor
imindoor
恩是 我现在就是用的临时表 效率还不错 感谢您的分享
0
wad12302
wad12302

先把时间查询出来表1,然后再查询(业务数据和时间表2) 再用 表1 左外连接 表2 

返回顶部
顶部