Laravel中按entry_id合并两行数据并新增对应金额列的方案
解决方案:合并同一entry_id的收支记录为单行
你可以用条件聚合(结合CASE WHEN与聚合函数)来实现需求,这种方式能把同一entry_id的in和out记录合并为单行,生成的查询可以直接作为子查询使用,完全替代你之前尝试的GROUP_CONCAT方案。
原生SQL子查询写法
直接写出可作为子查询的SQL语句,逻辑清晰且兼容性强:
SELECT entry_id, MAX(CASE WHEN type = 'in' THEN amount ELSE NULL END) AS in_amount, MAX(CASE WHEN type = 'out' THEN amount ELSE NULL END) AS out_amount FROM entry_entities GROUP BY entry_id
你可以把这段SQL当作子查询嵌入到其他语句中,比如:
SELECT * FROM ( SELECT entry_id, MAX(CASE WHEN type = 'in' THEN amount ELSE NULL END) AS in_amount, MAX(CASE WHEN type = 'out' THEN amount ELSE NULL END) AS out_amount FROM entry_entities GROUP BY entry_id ) AS merged_entries -- 可添加筛选、关联等逻辑 WHERE in_amount > 100;
Laravel Query Builder实现(支持子查询)
用Laravel的查询构造器写出等效代码,方便集成到业务逻辑中:
// 构建子查询 $mergedSubquery = DB::table('entry_entities') ->select( 'entry_id', DB::raw('MAX(CASE WHEN type = "in" THEN amount ELSE NULL END) AS in_amount'), DB::raw('MAX(CASE WHEN type = "out" THEN amount ELSE NULL END) AS out_amount') ) ->groupBy('entry_id'); // 将子查询用于主查询的示例 $finalResult = DB::table($mergedSubquery, 'merged') ->select('entry_id', 'in_amount', 'out_amount') // 可添加筛选条件 ->where('in_amount', '>', 50) ->get();
补充说明
- 为什么不用
GROUP_CONCAT:GROUP_CONCAT是将多个值拼接成字符串,无法直接生成独立的数值列,不符合你需要in_amount和out_amount两个字段的需求。 - 聚合函数选择:因为你提到同一
entry_id对应in和out各一条记录,用MAX或SUM效果一致;如果后续同一entry_id可能出现多条同类型记录,把MAX换成SUM即可实现金额累加。
内容的提问来源于stack exchange,提问作者Ibrahim Hasan
相关产品推荐
相关产品推荐

