如何在Laravel Eloquent中按关联表两列MAX值的GREATEST排序
Laravel Eloquent 按关联表两列最大值的较大值排序
需求:查询parents表数据,同时携带关联salaries表中to和from两列各自最大值的较大值,并按该计算值从高到低排序。对应的原生SQL逻辑如下:
SELECT GREATEST( MAX(COALESCE(`to`, 0)), MAX(COALESCE(`from`, 0)) ), `parent_id` FROM salaries GROUP BY `parent_id`;
解决方案1:子查询关联(推荐大数据量场景)
通过joinSub将薪资聚合的子查询与parents表关联,兼顾性能与可读性:
// 构建薪资聚合子查询 $salaryAggSubquery = DB::table('salaries') ->select( 'parent_id', DB::raw('GREATEST(MAX(COALESCE(`to`, 0)), MAX(COALESCE(`from`, 0))) as max_salary') ) ->groupBy('parent_id'); // 查询父表并关联排序 $parents = Parent::select('parents.*', 'max_salary') ->joinSub($salaryAggSubquery, 'salary_agg', function ($join) { $join->on('parents.id', '=', 'salary_agg.parent_id'); }) ->orderByDesc('max_salary') ->get();
解决方案2:内嵌子查询字段(简洁写法)
直接在select中嵌入子查询,为每条父记录计算对应薪资最大值:
$parents = Parent::select( 'parents.*', DB::raw('( SELECT GREATEST(MAX(COALESCE(`to`, 0)), MAX(COALESCE(`from`, 0))) FROM salaries WHERE salaries.parent_id = parents.id ) as max_salary') ) ->orderByDesc('max_salary') ->get();
两种方法均可得到符合预期的排序结果:
11 / jedenastka / 56 13 / trzynastka / 44 7 / siodemka / 23 12 / dwunastka / 14 10 / dyszka / 11 9 / dziewiatka. / 9 33 / trzydziestktrojka / 1
内容的提问来源于stack exchange,提问作者kicaj
相关产品推荐
相关产品推荐

