Laravel如何实现按日期统计下载量的累计和计算
实现累计下载量统计的两种方案
方案1:数据库窗口函数实现(推荐)
如果使用的是MySQL 8.0及以上、PostgreSQL等支持窗口函数的数据库,可以直接在查询阶段通过SUM() OVER()窗口函数完成累计值计算,无需后续PHP层处理,大数据量下性能更优。
直接修改原查询的select字段,新增累计和计算逻辑即可:
$downloads = Downloads::getTableName(); $model = Downloads::with([]) ->select([ DB::raw("date_format($downloads.created_at, '%Y-%m-%d') as date"), DB::raw("count($downloads.id) as total_count"), DB::raw("SUM(count($downloads.id)) OVER(ORDER BY date_format($downloads.created_at, '%Y-%m-%d')) as cumm_total_count") ]) ->groupBy(DB::raw("date_format($downloads.created_at, '%Y-%m-%d')")) ->orderBy('date'); return $model->get();
执行后返回的结果直接携带cumm_total_count字段,和预期结构完全一致。
方案2:Laravel集合层计算(兼容旧版数据库)
如果使用MySQL 5.7等不支持窗口函数的旧版数据库,可以先拿到按日期聚合的统计结果,再通过集合遍历累加计算累计值:
$downloads = Downloads::getTableName(); $statList = Downloads::with([]) ->select([ DB::raw("date_format($downloads.created_at, '%Y-%m-%d') as date"), DB::raw("count($downloads.id) as total_count") ]) ->groupBy(DB::raw("date_format($downloads.created_at, '%Y-%m-%d')")) ->orderBy('date') ->get(); $cummulativeTotal = 0; return $statList->map(function ($item) use (&$cummulativeTotal) { $cummulativeTotal += $item->total_count; $item->cumm_total_count = $cummulativeTotal; return $item; });
该方案逻辑是初始化累计值变量为0,按日期顺序遍历每一条统计结果时,将当日下载量加到累计值上,再赋值给当前条目的累计下载量字段,最终返回的结果结构和预期完全匹配。
内容的提问来源于stack exchange,提问作者aristotle29
相关产品推荐
相关产品推荐

