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

