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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:16:23