Laravel中关联相同值行并统计符合条件记录数的问题
问题描述
我有一个名为sales的表,包含transaction_id、transaction_refund_id、price字段,表数据如下:
| id | transaction_id | transaction_refund_id | price |
|---|---|---|---|
| 1 | tr_001 | 0 | 5 |
| 2 | tr_002 | tr_001 | 5 |
| 3 | tr_003 | tr_003 | 5 |
需要查询该表,统计**存在跨记录关联(某条记录的transaction_refund_id等于另一条记录的transaction_id)**的交易数量,预期结果为1(仅tr_001符合关联条件)。
尝试过whereColumn,但它是同记录内列比较,不符合需求;也试过Sales::all()->groupBy(['transaction_id', 'transaction_refund_id']),没得到预期结果。
解决方案
1. Laravel Eloquent 查询方式
通过自关联实现,将sales表自身关联,筛选出关联有效的记录后去重统计:
$count = Sales::select('original.transaction_id') ->from('sales as original') ->join('sales as refund', 'original.transaction_id', '=', 'refund.transaction_refund_id') // 排除自身退款ID等于交易ID的无效记录(如tr_003) ->where('original.transaction_id', '!=', 'original.transaction_refund_id') ->distinct() ->count(); // 最终结果:1
2. 原生SQL 查询方式
对应原生SQL逻辑一致,直接执行即可得到统计结果:
SELECT COUNT(DISTINCT original.transaction_id) AS count FROM sales original JOIN sales refund ON original.transaction_id = refund.transaction_refund_id WHERE original.transaction_id != original.transaction_refund_id;
逻辑说明
- 自关联将表拆分为两个角色:
original代表原始交易记录,refund代表关联的退款记录 distinct()避免同一交易被多次关联时重复统计- 额外的
where条件过滤掉自身闭环的无效记录,确保统计的是真正跨记录关联的交易
内容的提问来源于stack exchange,提问作者karen
相关产品推荐
相关产品推荐

