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

如何用Eloquent对UNION结果执行SELECT聚合查询?

解决Laravel Eloquent实现两表分组Union后外层聚合的问题

你之前的写法问题出在Eloquent的链式调用逻辑上——直接在$queryA后追加select和groupBy,会把这些操作塞进原查询内部,而非生成外层聚合查询。正确实现方式如下:

步骤1:定义两个表的分组查询

先分别写出表A、表B的基础分组统计逻辑:

$queryA = DB::table('A')
    ->selectRaw('month, year, COUNT(*) AS total, SUM(fee) AS total_fee')
    ->groupBy(['month', 'year']);

$queryB = DB::table('B')
    ->selectRaw('month, year, COUNT(*) AS total, SUM(fee) AS total_fee')
    ->groupBy(['month', 'year']);

步骤2:将Union结果作为子查询,执行外层聚合

把两个查询的Union结果当作临时表,用DB::table()包裹后做外层的分组聚合:

$finalQuery = DB::table($queryA->union($queryB), 'result_table')
    ->selectRaw('month, year, SUM(total) AS total, SUM(total_fee) AS total_fee')
    ->groupBy(['month', 'year'])
    ->orderByDesc('year')
    ->orderByDesc('month');

// 获取最终统计结果
$results = $finalQuery->get();

关键细节说明

  • 用DB::table($subquery, 'alias')的方式,能让Eloquent把Union后的查询识别为子查询表,外层的selectRaw和groupBy会正确作用在Union结果上,而非修改原查询。
  • 注意:你目标SQL里的外层COUNT(*) AS total是错误的——它只会统计子查询里的分组行数,并非总客户数。必须用SUM(total)累加两个表的total字段,才能得到正确的总客户数量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 18:55:18