php+mysql统计7天、30天每天数据没有补0

php+mysql统计7天、15天、30天没有补0;

 

先来看效果图

 

 

 

问题描述

 

查询数据库表中最近7天的记录

select count(id) count,FROM_UNIXTIME(dateline, '%m-%d') AS datetime from ymf_video_tongji WHERE dateline > UNIX_TIMESTAMP(date_sub(curdate(), interval 30 day)) group by datetime;

但是发现某一天没有数据,结果中没有最近30天每天的数据,只显示了有时间的 11行

 

解决思路

 

首先网上查询了一下

方法一(不推荐):Mysql 构建一个最近七天的结果集,然后和查询的结果集合做left join

查询一个最近7天的数据,没有补零,语句如下:

select a.click_date,ifnull(b.count,0) as count
from (
SELECT curdate() as click_date
union all
SELECT date_sub(curdate(), interval 1 day) as click_date
union all
SELECT date_sub(curdate(), interval 2 day) as click_date
union all
SELECT date_sub(curdate(), interval 3 day) as click_date
union all
SELECT date_sub(curdate(), interval 4 day) as click_date
union all
SELECT date_sub(curdate(), interval 5 day) as click_date
union all
SELECT date_sub(curdate(), interval 6 day) as click_date
) a left join (
select FROM_UNIXTIME(dateline, '%m-%d') AS datetime, count(*) as count
from ymf_video_tongji WHERE dateline > UNIX_TIMESTAMP(date_sub(curdate(), interval 6 day))
group by datetime
) b on a.click_date = b.datetime ORDER BY click_date DESC ;

 

上面的语句虽然可以查询出最近7天的数据,但是有个问题。

如果我们要做最近90天的查询怎么办?

那就要union all很多个,显示不是我们想要的结果

 

 

方法二(我们推荐这个)用PHP进行处理

 

$day为变量,这个日期我们可以定义,比如最近7天 $day为7就可以了,最近30天$day为30就可以了

 

$day = 30 ;
for ($i = $day - 1; 0 <= $i; $i--) {
$result[] = date('m-d', strtotime('-' . $i . ' day'));
$nums[] = 0;
}

 

这里我们构造最近30天数据,$day = 30

 

就会得到两个集合 $result 日期集合 $nums 日期对应数量集合

接下来利用array_walk进行循环,没有的补领

$scan_qushi 是我们运用最开始查询7天的那个数据查询方式查询出来近30天的数据(存在没有的)

array_walk($scan_qushi, function ($value, $key) use ($result, &$nums) {
$index = array_search($value['datetime'],$result);
$nums[$index] = $value['count'];
});
$data = [
'day' => $result,
'nums' => $nums
];

$result 日期 $nums 日期对应的数量,到此,我们完美的取出来了最近30天的数据。并且进行输出。

$data = [
'day' => $result,
'nums' => $nums
];


这样就可以交给echart工具进行数据展示了

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值