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

MySQL查询需求:找出满足特定场地条件的高分球员

解决你的MySQL查询需求

首先,我们需要明确核心需求:找出所有得分>99,并且在pid=1所有得分>99的场地中,每个场地都有得分>99记录的球员(排除pid=1自己)。你的原查询只检查了球员在pid=1的某一个高分场地有记录,但没确保覆盖所有目标场地,所以结果不符合预期。

这里提供两种可靠的解决方案:

方法1:统计匹配的场地数量

这种方法先获取pid=1的所有高分场地,再统计其他球员在这些场地中的达标记录数量,只有数量完全匹配的球员才符合条件:

SELECT p.pname
FROM player p
JOIN matches mn ON mn.pid = p.pid
WHERE p.pid != 1 
  AND mn.score > 99
  -- 只考虑pid=1有高分的场地
  AND mn.gid IN (SELECT DISTINCT gid FROM matches WHERE pid = 1 AND score > 99)
GROUP BY p.pid, p.pname
-- 确保该球员在所有pid=1的高分场地都有达标记录
HAVING COUNT(DISTINCT mn.gid) = (SELECT COUNT(DISTINCT gid) FROM matches WHERE pid = 1 AND score > 99);

逻辑拆解:

  1. 子查询(SELECT DISTINCT gid FROM matches WHERE pid = 1 AND score > 99)先提取pid=1所有得分>99的场地(这里是gid=1、3、5,共3个)。
  2. 主查询筛选出非pid=1、得分>99且场地在上述集合内的记录。
  3. 按球员分组后,统计该球员在这些场地中达标(得分>99)的不同场地数量,只有数量等于pid=1的高分场地总数时,才说明该球员覆盖了所有目标场地。

方法2:双重NOT EXISTS验证

这种方法通过双重否定逻辑,确保不存在pid=1的高分场地是当前球员没有达标记录的:

SELECT p.pname
FROM player p
WHERE p.pid != 1
AND NOT EXISTS (
    -- 查找pid=1有高分,但当前球员没有高分记录的场地
    SELECT gid FROM matches m1
    WHERE m1.pid = 1 AND m1.score > 99
    AND NOT EXISTS (
        SELECT 1 FROM matches m2
        WHERE m2.pid = p.pid 
          AND m2.gid = m1.gid 
          AND m2.score > 99
    )
);

逻辑拆解:

  • 外层NOT EXISTS表示:不存在任何一个pid=1的高分场地,是当前球员没有得分>99记录的。
  • 换句话说,pid=1的每一个高分场地,当前球员都有对应的达标记录,完全符合你的需求。

这两种方法都能正确返回你期望的结果:kohli(pid=2)和awais(pid=6)。

内容的提问来源于stack exchange,提问作者Sami Ullah Khalid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:49:17