You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中关联相同值行并统计符合条件记录数的问题

问题描述

我有一个名为sales的表,包含transaction_id、transaction_refund_id、price字段,表数据如下:

idtransaction_idtransaction_refund_idprice
1tr_00105
2tr_002tr_0015
3tr_003tr_0035

需要查询该表,统计**存在跨记录关联(某条记录的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 22:25:03