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

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

 

先来看效果图

 

php+mysql统计7天、30天每天数据没有补0_第1张图片

 

 

问题描述

 

查询数据库表中最近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行

php+mysql统计7天、30天每天数据没有补0_第2张图片

 

解决思路

 

首先网上查询了一下

方法一(不推荐):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工具进行数据展示了

 

你可能感兴趣的:(PHP)