MySQL查询需求:筛选所有村庄坐标符合指定范围的玩家
解决MySQL筛选"所有村庄均符合坐标条件"的玩家问题
我明白你的问题了——你需要的是所有村庄都满足x在100-200、y在0-100之间的玩家,而你的原查询只会返回至少有一个村庄符合条件的玩家,这就是为什么达不到预期效果。下面给你两种靠谱的解决方案:
方法1:分组统计匹配数(直观易懂)
通过分组后比较玩家的总村庄数和符合条件的村庄数,当两者相等时,说明该玩家的所有村庄都满足要求:
SELECT p.playerName FROM player p JOIN village v ON p.playerID = v.playerID GROUP BY p.playerID, p.playerName HAVING COUNT(*) = SUM( CASE WHEN v.x BETWEEN 100 AND 200 AND v.y BETWEEN 0 AND 100 THEN 1 ELSE 0 END );
逻辑解释:
COUNT(*)统计当前玩家拥有的所有村庄数量SUM(CASE ...)统计当前玩家符合坐标条件的村庄数量- 只有当两者数值相等时,才意味着该玩家没有任何一个村庄不符合条件
方法2:排除法(性能更优)
用NOT EXISTS子句排除掉存在不符合条件村庄的玩家,剩下的就是所有村庄都达标的玩家:
SELECT p.playerName FROM player p WHERE NOT EXISTS ( SELECT 1 FROM village v WHERE v.playerID = p.playerID AND NOT (v.x BETWEEN 100 AND 200 AND v.y BETWEEN 0 AND 100) );
逻辑解释:
- 子查询会检查当前玩家是否存在任何一个不符合坐标条件的村庄
NOT EXISTS表示如果子查询找不到这样的村庄,就保留该玩家(即所有村庄都符合要求)
小提示:
如果你的数据量较大,优先选择方法2,因为NOT EXISTS在找到第一个不符合条件的村庄后就会停止检查,效率更高。另外,记得给village表的playerID字段建立索引,这样关联查询会更快。
内容的提问来源于stack exchange,提问作者Žan Konečnik
相关产品推荐
相关产品推荐

