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

将指定MySQL嵌套查询转换为Laravel Query Builder的技术求助

将指定MySQL嵌套查询转换为Laravel Query Builder的技术求助

嘿,我来帮你搞定这个嵌套查询转Laravel Query Builder的问题!

首先,先明确你的需求:你需要把这段嵌套的MySQL查询转换成Laravel Query Builder语法,并且最终结果必须是Query Builder实例(而不是直接执行后的集合)。你的原始SQL和已经写了一半的代码我都看明白了,接下来直接上解决方案:

你的原始MySQL查询

SELECT MAX(sub.total) as total, sub.vendedor
FROM (
    SELECT COUNT(id) as total, vendedor
    FROM data_reports dr
    GROUP BY vendedor
) sub

你已完成的部分代码

$data = DB::table('data_reports')
    ->select(DB::raw('COUNT(id) as total, vendedor'))
    ->groupBy('vendedor');

完整的Laravel Query Builder实现

// 第一步:定义子查询(就是你已经写好的那部分)
$subQuery = DB::table('data_reports')
    ->selectRaw('COUNT(id) as total, vendedor') // 用selectRaw比DB::raw更简洁
    ->groupBy('vendedor');

// 第二步:外层查询,将子查询作为临时表使用
$data = DB::table($subQuery, 'sub') // 第二个参数是子查询的别名,对应SQL里的`sub`
    ->selectRaw('MAX(sub.total) as total, sub.vendedor')
    // 注意:如果有多个销售员的统计数并列最大值,原始SQL会随机返回一个;
    // 如果需要稳定返回某一个,可以加orderBy和limit,比如:
    // ->orderBy('sub.total', 'desc')
    // ->limit(1)
;

关键说明

  1. 这样得到的$data就是一个纯正的Illuminate\Database\Query\Builder实例,完全满足你“结果为Query Builder类型”的要求,你可以后续继续链式调用其他Query Builder方法(比如where、orderBy等),或者在需要的时候执行->get()/->first()获取结果。
  2. 用selectRaw替代select(DB::raw(...))是Laravel推荐的更简洁的写法,功能完全一致。
  3. 如果你希望在有多个并列最大值的情况下,稳定返回其中一个,可以加上注释里的orderBy和limit(1),这和原始SQL的逻辑兼容(原始SQL在这种场景下的返回结果是不确定的)。

备注:内容来源于stack exchange,提问作者Efratista

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 10:24:32