最近6天/6周/6月的数据统计,没有补0的需求

最近接到一个需求:
1.要求做一些大屏数据展示,数据可视化,将用户的一些数据(例如评论次数、投诉次数)放到可视化的屏幕中,如果当天/当周/当月没有数据,则显示0,形成折线图

背景:
使用Laravel6.0框架开发
单独做出统计表,以天为单位做出点击次数、评论次数、投诉次数进行统计(数据量大的时候,千万不要全表扫描业务表。)

开发:

利用Sql语句比较容易的查出这些数据,但是就难为在了没有的时候数据补0上,当使用foreach挨个比对时,感觉效率太低,于是找到了下面一个办法

代码:
1.显示最近7天的数据展示

 $params = $request->all();

 $array = [];
 $day = 7;
 for ($i = $day - 1; 0 <= $i; $i--) {
     $array[] = date('Y-m-d 00:00:00', strtotime('-' . $i . ' day'));
     $nums[] = 0;
 }
 
 $result =  DB::table('data_insert_days')
         ->select([
             DB::raw("FROM_UNIXTIME(UNIX_TIMESTAMP(time),'%Y-%m-%d') as date"),
             DB::raw('sum(number) AS count'),
         ])
         ->whereBetween('time', [Carbon::yesterday()->subDays(7), Carbon::now()])
         ->groupBy("date")
         ->orderBy('date', 'asc')
         ->get()
         ->toArray();
         
 array_walk($result, function ($value, $key) use ($array, &$nums) {
         $index = array_search($value->date,$array);
         $nums[$index] = $value->count;
     });
     $data = [
         'date' => $array,
         'count' => $nums
     ];

那么最终展示数据结构为

{
    "data": {
        "date": [
            "2020-05-19",
            "2020-05-20",
            "2020-05-21",
            "2020-05-22",
            "2020-05-23",
            "2020-05-24",
            "2020-05-25"
        ],
        "count": [
            "36",
            "11",
            "45",
            "49",
            "38",
            "39",
            "1"
        ]
    },
    "Success": true,
    "Message": {
        "Code": 0,
        "Content": "操作成功"
    }
}

最近6周的数据展示

    $today_week = date('W',time());
    $start_week = $today_week-7;
    for ($i = $start_week + 1; $i<=$today_week; $i++) {
        $array[] = $i;
        $nums[] = 0;
    }
  
    $result = DB::table('data_insert_days')
            ->select(DB::raw('weekofyear(time) as w, SUM(number) as t'))
            ->where("site_id",$params['site_id'])
            ->whereRaw('time > DATE_SUB(now(), INTERVAL 7 WEEK)')
            ->groupBy(DB::raw('weekofyear(time)'))
            ->get()
            ->toArray();

    array_walk($result, function ($value, $key) use ($array, &$nums) {
            $index = array_search($value->w,$array);
            $nums[$index] = $value->t;
        });

        $data = [
            'w' => $array,
            't' => $nums
        ];
        

以此类推可以算出最近6个月的数据。

阅读 145

推荐阅读
kobe088124
用户专栏

书写php,mysql,js,等技术和自己心得

4 人关注
22 篇文章
专栏主页