如何使用雄辩的 Laravel 获得两个表的总和和组响应?

Posted

技术标签:

【中文标题】如何使用雄辩的 Laravel 获得两个表的总和和组响应?【英文标题】:how to get total sum of two tables and group responses with eloquent Laravel? 【发布时间】:2021-10-07 22:47:54 【问题描述】:

我正在尝试使用 eloquent 创建一个查询,我需要知道由 id、username 和 session_id 总和的总分。 但我得到的结果不正确。

我的代码

$query = DB::table('advisors')
    ->select('advisors.id','advisors.nombre_comercial','session_details.session_id',
        DB::raw('SUM(session_details.spent_points + template_sales.price_points) AS suma_total'))
    ->join('consultancy_requests','advisors.id','=','consultancy_requests.advisor_id')
    ->whereBetween('consultancy_requests.created_at',[$from,$to])
    ->join('receipts','consultancy_requests.id','=','receipts.session_id')
    ->where('receipts.status',NULL)
    ->whereBetween('receipts.created_at',[$from,$to])
    ->join('session_details','consultancy_requests.consultancy_id','=','session_details.session_id')
    ->whereBetween('session_details.created_at',[$from,$to])
    ->join('template_sales','session_details.session_id','=','template_sales.session_id')
    ->whereBetween('template_sales.created_at',[$from,$to])
    ->groupBy('advisors.id','advisors.nombre_comercial','session_details.session_id')
    ->get();

代码响应

session_details 表

template_sales 表

这是我想得到的正确答案。

【问题讨论】:

【参考方案1】:

我注意到您的查询中有几个错误。例如,您不需要 SUM (session_details.spent_points + template_sales.price_points),因为这已经在执行加法。

与其指出所有这些,不如让我们将您的问题分解成更小的部分;当查询看起来很复杂时,最好将其分解以便更好地理解。似乎有几张表格,但我会根据提供的两张表格来回答,这应该会给你一个起点。

基本上,你想要的是,

得到每个session_idspent_points 的总和;所以你需要group by session_idsum(spent_points)

$sumSpentPointsQuery = DB::table('session_details')
                       ->select('session_id', DB::raw('SUM(spent_points) as sum_spent_points'))
                       ->groupBy('session_id');

得到每个session_idprice_points 的总和;所以你需要group by session_idsum(price_points)

$sumPricePointsQuery = DB::table('template_sales')
                       ->select('session_id', DB::raw('SUM(price_points) as sum_price_points'))
                       ->groupBy('session_id');

现在我们需要添加sum_spent_pointssum_price_points。这次我们的表将是我们从子查询中获得的结果。所以我们可以使用 Laravel 的 fromSubjoinSub 来得到我们想要的结果。

DB::query()
    ->select('ssp.session_id as session_id', DB::raw('sum_spent_points + sum_price_points as suma_total') )
    ->fromSub($sumSpentPointsQuery, 'ssp')
    ->joinSub($sumPricePointsQuery, 'spp', function($join)
         $join->on('ssp.session_id', '=', 'spp.session_id');
    )->get();

这个查询应该产生代表这个的 sql:

select ssp.session_id as session_id, (sum_spent_points + sum_price_points) as suma_total 
from 
  (select session_id, sum(spent_points) as sum_spent_points 
  from session_details group by session_id) ssp
inner join 
  (select session_id, sum(price_points) as sum_price_points 
  from template_sales group by session_id) spp 
on ssp.session_id = spp.session_id ;

希望这能让你朝着正确的方向前进。

【讨论】:

感谢您的帮助,您让我对如何看待问题和解决问题有了新的认识。

以上是关于如何使用雄辩的 Laravel 获得两个表的总和和组响应?的主要内容,如果未能解决你的问题,请参考以下文章

将联合与laravel结合使用时如何获得两个不同表的总和

Laravel 雄辩的查询与条件下另一个表中的值的总和

如何根据“枚举”列获得分类的 laravel 雄辩结果并在一页中显示?

使用 where 子句检索数据时,无论如何要检索计数 0 吗? (Laravel 雄辩)

如何使用父枢轴值作为条件获得雄辩的关系

Laravel 通过属性获得雄辩的查询构建器关系