1. 程式人生 > >php+mysql統計7天、30天每天資料沒有補0

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工具進行資料展示了