如何获取特定状态或 id 的总和,并在 laravel 中连接 3 表



my table

table1
|table1_id | name |
| 1         john |
| 2         dave |
| 3         carl |
table2
|table2_id| table1_id| type  |status
| 1       | 1        | shoes |paid
| 2       | 1        | bag   |paid
| 3       | 2        | bag   |paid
| 4       | 2        | shoes   |unpaid
table3
|table3_id|table2_id|item  |amount|
|1        |  1      |nike   |1000  |
|2        |  1      |adidas |2000  |
|3        |  2      |lv     |1000  |
|4        |  3      |lv1    |2000  |
|5        |  3      |lv     |1000  |
|6        |  4      |adidas |1000  |

这是我想要显示的结果 约翰---总付费鞋和包戴夫<--包的总价,'鞋是 未付,因此 1000 不添加到总数中'

|name|total |
|john|4000  |
|dave|3000  | 
|carl|0  | 

这是我的控制器,它给了我一个错误,所有名称的总数都相同

public function index()
{
$fetch = DB::table('table1')
->leftjoin('table2','table1.table1_id','=','table2.table1_id')      
->leftjoin('table3','table2.table2_id','=','table3.table2_id')
->select('table1.*','table2.*',DB::raw('(select sum(table3.amount) from table3
join table2 on table2.table2_id = table3.table2_id 
where table.status = "paid") as used'))
->groupBy('table1.table1_id')

->get();
return $fetch;
}

您可以考虑加入子查询,这当然是一种方法。下面是一个示例:

$sales = DB::table('table3')
->select('table2_id', DB::raw('sum(amount) as cat_sale_amount'))
->groupBy('table2_id');
$table2Sales = DB::table('table2')
->select('table1_id', DB::raw('sum(cat_sale_amount) as total_sale_amount'))
->joinSub($sales, 'sales', function($join){
$join->on('table2.id', '=', 'sales.table2_id');
})
->where('status', 'paid')
->groupBy('table1_id');
$userTotalSales = DB::table('table1')
->select('name', 'total_sale_amount as total')
->leftJoinSub($table2Sales, 'table2Sales', function($join){
$join->on('table1.id', '=', 'table2Sales.table1_id');
})->get();

第一个子查询将根据表1中的type给出总销售额,该是通过对table2_id进行分组并对金额使用总和运算来实现的。因此,结果将列出user_id/table2_id和每种类型的金额。

第二个子查询将通过联接第一个子查询来给出单个客户/用户的总销售额。按保管人/用户/table1_id分组,从第一次查询中获取金额的总和,以获取单个客户的总数。

将第二个连接到用户表,您应该得到所需的结果。

相关内容

  • 没有找到相关文章

最新更新