游戏脚本多表关联查询结果冗余问题求助
解决多表关联查询结果冗余的问题
你的查询现在有两个问题,导致结果冗余还逻辑不对:
- 逻辑运算符优先级错误:原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
相关产品推荐
相关产品推荐

