如何使用雄辩的 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_id
的spent_points
的总和;所以你需要group by session_id
和sum(spent_points)
$sumSpentPointsQuery = DB::table('session_details')
->select('session_id', DB::raw('SUM(spent_points) as sum_spent_points'))
->groupBy('session_id');
得到每个session_id
的price_points
的总和;所以你需要group by session_id
和sum(price_points)
$sumPricePointsQuery = DB::table('template_sales')
->select('session_id', DB::raw('SUM(price_points) as sum_price_points'))
->groupBy('session_id');
现在我们需要添加sum_spent_points
和sum_price_points
。这次我们的表将是我们从子查询中获得的结果。所以我们可以使用 Laravel 的 fromSub
和 joinSub
来得到我们想要的结果。
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 雄辩结果并在一页中显示?