php+mysql統計7天、30天每天資料沒有補0
阿新 • • 發佈:2019-01-26
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工具進行資料展示了