按日期分组并去重user_id,统计每日有Swipes的用户数量
每日滑动行为用户数统计方案
需求
统计每日有滑动(Swipes)行为的用户数量:按日期分组,每组内同一用户(user_id)多次滑动仅计1次,最终输出每日的用户计数,而非具体滑动记录。
你的代码问题
你写的这段代码:
Swipe::all()->groupBy(function($item){ return $item->created_at->format('d-M-y'); })->unique('user_id')
逻辑有误——unique('user_id')是对整个集合去重,不是分组内去重。比如用户在两天都有滑动,只会被保留在其中一个日期组里,完全不符合需求。
正确实现
方案1:数据库端统计(优先选,性能好)
直接用SQL做分组+去重计数,不用把所有记录加载到内存:
// 基础版,日期格式为YYYY-MM-DD $dailyCounts = Swipe::selectRaw('DATE(created_at) as date, COUNT(DISTINCT user_id) as user_count') ->groupBy('date') ->get(); // 如果要你需要的d-M-y格式(比如05-Oct-24),MySQL用DATE_FORMAT调整 $dailyCounts = Swipe::selectRaw("DATE_FORMAT(created_at, '%d-%b-%y') as date, COUNT(DISTINCT user_id) as user_count") ->groupBy('date') ->get();
方案2:集合层面处理(仅适合小数据量)
如果一定要在Laravel集合里处理,需要对每个分组单独去重计数:
$dailyCounts = Swipe::all() ->groupBy(fn($item) => $item->created_at->format('d-M-y')) ->map(fn($group) => $group->unique('user_id')->count());
返回的是键为日期、值为当日滑动用户数的集合。
内容的提问来源于stack exchange,提问作者combi35
相关产品推荐
相关产品推荐

