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);
逻辑拆解:
- 子查询
(SELECT DISTINCT gid FROM matches WHERE pid = 1 AND score > 99)先提取pid=1所有得分>99的场地(这里是gid=1、3、5,共3个)。 - 主查询筛选出非pid=1、得分>99且场地在上述集合内的记录。
- 按球员分组后,统计该球员在这些场地中达标(得分>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
相关产品推荐
相关产品推荐

