MySQL作业求助:筛选有2次及以上40美元+罚款的球员
解决MySQL作业题:筛选有2次及以上高额罚款的球员
你的现有代码存在两处核心问题:
WHERE amount > 40 IN (...)语法逻辑错误:这个写法将amount > 40的布尔结果与子查询返回的球员ID做匹配,完全偏离了需求逻辑。- 子查询中的
COUNT(DISTINCT playerno)无效:按playerno分组后,每个分组内的球员ID唯一,统计结果始终为1,HAVING COUNT(...) > 1的条件无法起到筛选作用。
正确实现思路
要满足需求,需先统计每个球员金额超过40美元的罚款次数,筛选出次数≥2的球员,再获取其姓名及首字母(假设存在存储球员信息的players表)。以下是符合「子查询+聚合函数」要求的解法:
-- 关联players表获取姓名和首字母 SELECT p.playerno, p.name, LEFT(p.name, 1) AS initial -- 提取姓名首字母 FROM players p WHERE p.playerno IN ( -- 子查询:筛选出有2次及以上金额超40美元罚款的球员ID SELECT playerno FROM penalties WHERE amount > 40 -- 先过滤出高额罚款记录 GROUP BY playerno HAVING COUNT(*) >= 2 -- 统计该球员的高额罚款次数≥2 );
如果仅需获取符合条件的球员ID,可简化为:
SELECT playerno FROM penalties WHERE amount > 40 GROUP BY playerno HAVING COUNT(*) >= 2;
数据验证
基于你提供的penalties表数据:
- 球员6:1次高额罚款
- 球员44:1次高额罚款
- 球员27:2次高额罚款(100.00、75.00)
- 球员104:1次高额罚款
- 球员8:0次高额罚款
执行上述代码后,只会返回球员27,与预期结果一致。
内容的提问来源于stack exchange,提问作者ADrake
相关产品推荐
相关产品推荐

