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

Laravel MySQL分组查询问题:获取各vendor_code最大version_id

解决按vendor_code分组取最大version_id记录的问题

我明白你现在的困扰了——你想拿到每个vendor_code分组里对应最大version_id的那条记录,但当前的查询逻辑有问题:你用的是全局最大的version_id来筛选,而不是每个分组内部的最大值,所以达不到预期效果。

问题分析

你原查询里的这行代码:

->whereRaw('version_id = (SELECT MAX(version_id) from vendors)')

它的作用是找出整个vendors表中version_id最大的那条(或几条)记录,再按vendor_code分组,这和你“每个分组取最大版本”的需求完全不符。

解决方案1:子查询关联(兼容所有MySQL版本)

先通过子查询算出每个vendor_code对应的最大version_id,再关联原表匹配对应记录:

$vendors = $this->account->vendors()
    ->join(
        DB::raw('(SELECT vendor_code, MAX(version_id) AS max_version FROM vendors GROUP BY vendor_code) AS vendor_max'),
        function($join) {
            $join->on('vendors.vendor_code', '=', 'vendor_max.vendor_code')
                 ->on('vendors.version_id', '=', 'vendor_max.max_version');
        }
    )
    ->select('vendors.*') // 确保只取原表字段,避免重复
    ->orderBy($this->orderBy, $this->sortBy)
    ->paginate($this->display_per_page);

这个方法的逻辑是:先得到每个供应商的最高版本号,再把原表和这个结果关联,精准定位到每个供应商的最新版本记录。

解决方案2:窗口函数(MySQL 8.0+推荐)

如果你的MySQL版本是8.0及以上,用窗口函数会更简洁高效:

$vendors = $this->account->vendors()
    ->whereRaw('
        ROW_NUMBER() OVER (PARTITION BY vendor_code ORDER BY version_id DESC) = 1
    ')
    ->orderBy($this->orderBy, $this->sortBy)
    ->paginate($this->display_per_page);

ROW_NUMBER()窗口函数会按vendor_code分组,每组内按version_id倒序排序,行号为1的就是该组里版本最高的记录,筛选这些行就得到你要的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:03:02