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工具进行数据展示了