You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 16:23:13