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
相关产品推荐
相关产品推荐

