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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:58:18