Laravel 10 groupBy统计问题:重复parent_token需取最新行计算
问题分析
你的代码问题在于直接按status和parent_token分组,这会把每一组不同的status+parent_token组合都单独统计,自然会返回所有符合分组条件的结果,完全没实现“相同parent_token仅取最新行”的前置筛选逻辑。
解决方案
要达成需求,必须先筛选出每个parent_token对应的最新记录,再基于这些记录统计不同status的数量。假设你的表有自增id字段(最新数据id更大)或created_at字段(记录创建时间)来判断“最新”,以下是两种可行实现:
方式一:子查询筛选最新行
// 先获取每个parent_token对应的最新记录ID $latestRecords = DB::table('crm_details') ->select('parent_token', DB::raw('MAX(id) as latest_id')) // 用时间判断就换成MAX(created_at) ->groupBy('parent_token') ->get(); // 提取所有最新记录的ID集合 $latestIds = $latestRecords->pluck('latest_id')->toArray(); // 基于最新记录统计各status数量 $salesCounts = DB::table('crm_details') ->whereIn('id', $latestIds) ->select('status', DB::raw('count(*) as count')) ->groupBy('status') ->get(); dd($salesCounts);
方式二:JOIN关联筛选最新行
$salesCounts = DB::table('crm_details as cd') ->select('cd.status', DB::raw('count(*) as count')) ->join( DB::raw('(SELECT parent_token, MAX(id) as latest_id FROM crm_details GROUP BY parent_token) as latest'), function ($join) { $join->on('cd.id', '=', 'latest.latest_id'); } ) ->groupBy('cd.status') ->get(); dd($salesCounts);
注意事项
如果是用created_at判断最新,需要把代码里的MAX(id)替换为MAX(created_at),同时关联条件要对应调整为cd.created_at = latest.latest_created_at(子查询里的字段别名也要同步修改)。执行后就能得到你期望的Yes:2、No:2统计结果。
内容的提问来源于stack exchange,提问作者Yadhu Babu
相关产品推荐
相关产品推荐

