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

Laravel Query Builder:结合orderBy与groupBy获取最新live记录

解决Laravel Query Builder获取每个公司最新Live记录的问题

嘿,我完全懂你的困扰——直接用groupBy加orderBy的顺序确实会踩坑,因为MySQL的分组逻辑是先把相同company的记录归为一组,然后默认取每组里的第一条记录,这时候后面的orderBy根本没机会对分组前的所有live记录排序,结果自然不可预测。

不用写原生SQL,咱们用Laravel的Query Builder就能搞定,给你两种靠谱的方案:

方案一:关联子查询匹配最新日期

这种方法先通过子查询找到每个公司的最新live日期,再和原表关联筛选出对应记录:

return $query->select('company', 'date')
    ->where('period', '=', 'live')
    ->whereExists(function ($subQuery) {
        $subQuery->select(DB::raw(1))
            ->from('your_table_name as latest') // 替换成你的实际表名
            ->whereColumn('latest.company', 'your_table_name.company')
            ->where('latest.period', '=', 'live')
            ->groupBy('latest.company')
            ->havingRaw('MAX(latest.date) = your_table_name.date');
    });

方案二:使用窗口函数(Laravel 8+支持)

窗口函数可以直接给每个公司的live记录按日期排序打排名,然后取排名第一的记录:

return $query->select('company', 'date')
    ->where('period', '=', 'live')
    ->selectRaw('RANK() OVER (PARTITION BY company ORDER BY date DESC) as record_rank')
    ->having('record_rank', '=', 1)
    ->get();

为什么你的原代码不行?

再啰嗦两句帮你理清楚:你的代码是先groupBy('company')把同公司的记录合并,再orderBy('date','desc')——但这时候排序是对分组后的结果排序,而分组时MySQL已经随机(或者按存储顺序)取了每组的第一条记录,所以完全达不到你想要的“先给所有live记录按日期降序,再取每个公司第一条”的效果。

内容的提问来源于stack exchange,提问作者sveti petar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:26:56