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

游戏脚本多表关联查询结果冗余问题求助

解决多表关联查询结果冗余的问题

你的查询现在有两个问题,导致结果冗余还逻辑不对:

  • 逻辑运算符优先级错误:原WHERE子句里AND比OR优先级高,实际执行的是(u.id=1 AND b.comBan=1) OR b.playerBan>0 OR b.nGameBan>0,这会把所有满足后两个封禁条件的记录都查出来,不管是不是属于指定UID的匹配。
  • 重复关联导致冗余行:同一个玩家可能对应多个匹配(player2match表有多条记录),JOIN之后同一条封禁记录会被重复输出。

给你两种解决办法:

方案1:修正逻辑+去重

在原查询基础上,把封禁条件用括号括起来保证逻辑正确,同时加DISTINCT去重:

SELECT DISTINCT b.*
FROM banInfo AS b
JOIN players AS p ON b.game_id = p.game_id
JOIN player2match AS pm ON pm.pid = p.id
JOIN matches AS m ON m.id = pm.mid
JOIN users AS u ON u.id = m.uid
WHERE u.id = 1 AND (b.comBan = 1 OR b.playerBan > 0 OR b.nGameBan > 0)

方案2:用EXISTS子查询(更推荐)

这种方法不用先JOIN所有表再去重,直接检查玩家是否属于指定UID的匹配,同时满足封禁条件,效率更高,也不会产生冗余:

SELECT b.*
FROM banInfo AS b
WHERE (b.comBan = 1 OR b.playerBan > 0 OR b.nGameBan > 0)
AND EXISTS (
    SELECT 1
    FROM players AS p
    JOIN player2match AS pm ON pm.pid = p.id
    JOIN matches AS m ON m.id = pm.mid
    WHERE p.game_id = b.game_id
    AND m.uid = 1
)

方案2通过EXISTS只验证玩家是否存在于目标UID的匹配中,不会因为多匹配关联重复输出同一条封禁记录,逻辑更清晰,性能也更好。

内容的提问来源于stack exchange,提问作者HDIK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:42:35