Laravel:多列相乘后求和的关联查询实现问题
解决Laravel中关联表计算乘积之和的查询问题
嘿,我来帮你把这个查询补全并修正!你的需求是关联particulars和reqs表,计算price与quantity_issued的乘积总和,原代码的问题主要是groupBy部分不完整,而且要注意MySQL的分组规则(默认开启ONLY_FULL_GROUP_BY),下面是完整的正确实现:
$particulars = DB::table('particulars as A') ->leftJoin('reqs as B', function ($join) { $join->on('A.particular_id', '=', 'B.particular_id'); }) ->whereBetween('B.date_issued', [$start_date, $end_date]) ->select( 'A.particular_id', 'A.item_name', 'A.unit', 'A.price', DB::raw('SUM(B.quantity_issued) as total_quantity'), // 可选:统计该物料的总发出数量 DB::raw('SUM(A.price * B.quantity_issued) as total_cost') ) ->groupBy('A.particular_id', 'A.item_name', 'A.unit', 'A.price') ->get();
关键说明:
- 分组规则:因为MySQL默认开启
ONLY_FULL_GROUP_BY模式,所以select里所有非聚合函数的字段(比如item_name、unit)都必须加入groupBy。这里用A.particular_id作为核心分组字段(它是物料的唯一标识),再加上其他属性字段,保证分组结果的准确性。 - 聚合处理:直接把
B.quantity_issued放在select里会返回随机值(分组后无法确定取哪一条的数量),如果需要统计总发出数量,用SUM(B.quantity_issued);如果不需要这个字段,可以直接删掉。 - 左连接的特性:用
leftJoin会保留所有particulars表的记录,即使某个物料没有对应的reqs数据,total_cost会返回0。如果只想统计有过发出记录的物料,把leftJoin改成join(内连接)即可。 - 日期格式:确保
$start_date和$end_date是合法的日期格式(比如Carbon实例或者'YYYY-MM-DD'字符串),否则whereBetween无法正确筛选数据。
内容的提问来源于stack exchange,提问作者fetty
相关产品推荐
相关产品推荐

