关联查询结果去重:交易匹配SQL重复结果解决需求
解决交易匹配查询中的重复条目问题
看起来你遇到了自连接交易表时出现重复匹配的问题,这在交易配对场景里很常见,我来帮你梳理下问题原因和解决方案:
问题根源分析
你当前的查询没有限制配对的唯一性,也没有明确限定必须是同一货币对的交易:
- 当交易A和交易B满足匹配条件时,查询会同时返回
(A,B)和(B,A)两组结果,导致重复 - 缺少
pair_id相等的条件,可能会出现跨不同货币对的无效匹配
优化后的查询语句
下面的SQL会帮你获取唯一的可执行匹配交易,同时避免无效配对:
SELECT d1.*, d2.* FROM deals d1 JOIN deals d2 ON d1.pair_id = d2.pair_id -- 确保匹配的是同一货币对的交易 AND d1.amount_to_sell = d2.amount_to_buy -- d1要卖出的金额等于d2要买入的金额 AND d1.amount_to_buy = d2.amount_to_sell -- d1要买入的金额等于d2要卖出的金额 AND d1.id < d2.id -- 核心:确保每对交易只返回一次,消除(A,B)和(B,A)的重复 AND d1.user_id != d2.user_id; -- 可选:禁止同一用户的交易自我匹配(根据业务需求调整)
关键优化点说明
d1.pair_id = d2.pair_id:必须加入这个条件,否则会出现不同货币对之间的无效匹配(比如美元兑欧元的交易和欧元兑英镑的交易被错误配对)d1.id < d2.id:通过限制交易ID的大小关系,让每一对有效匹配只被检索一次,彻底解决重复问题d1.user_id != d2.user_id:如果业务规则不允许用户自己和自己完成交易,就加上这个条件,避免无效的自我配对
关联货币表的增强查询(可选)
如果需要在结果中显示具体的货币种类(比如to_sell和to_buy对应的货币),可以关联currencies表:
SELECT d1.id AS deal1_id, d1.user_id AS deal1_user, c.to_sell AS sell_currency, c.to_buy AS buy_currency, d1.amount_to_sell, d1.amount_to_buy, d2.id AS deal2_id, d2.user_id AS deal2_user FROM deals d1 JOIN deals d2 ON d1.pair_id = d2.pair_id AND d1.amount_to_sell = d2.amount_to_buy AND d1.amount_to_buy = d2.amount_to_sell AND d1.id < d2.id AND d1.user_id != d2.user_id JOIN currencies c ON d1.pair_id = c.id;
这个查询会输出更直观的结果,包含交易双方的信息和对应的货币种类。
内容的提问来源于stack exchange,提问作者Yur Gasparyan
相关产品推荐
相关产品推荐

