MySQL ERROR 1247报错求助:HackerRank竞赛排行榜SQL查询问题
问题分析与解决方案
代码错误点
- 语法错误:HAVING子句无法直接引用SELECT中定义的别名
total,MySQL不支持这种用法;子查询里的sum(total)中的total未定义,直接触发报错。 - 逻辑错误:
- 直接使用
sum(s.score)会累加黑客所有提交的得分,而题目要求是每个挑战取最高得分后再求和,完全不符合需求。 - 子查询的嵌套逻辑混乱,试图用
in匹配的思路完全没必要,属于绕远路且逻辑错误。
- 直接使用
正确解决思路
要满足题目要求,需要分三步处理:
- 先提取每个黑客在每个挑战中的最高得分:按
hacker_id和challenge_id分组,用MAX(score)得到单挑战最高分。 - 基于第一步的结果,按
hacker_id分组求和,得到每个黑客的总得分,同时过滤掉总得分0的记录。 - 将上述结果与
Hackers表关联获取姓名,最后按总得分降序、黑客ID升序排序。
完整SQL代码
SELECT h.hacker_id, h.name, total_score FROM Hackers h JOIN ( -- 计算每个黑客的总得分(各挑战最高分之和) SELECT hacker_id, SUM(max_score) AS total_score FROM ( -- 每个黑客每个挑战的最高分 SELECT hacker_id, challenge_id, MAX(score) AS max_score FROM Submissions GROUP BY hacker_id, challenge_id ) AS challenge_max_scores GROUP BY hacker_id HAVING total_score > 0 ) AS hacker_totals ON h.hacker_id = hacker_totals.hacker_id ORDER BY total_score DESC, h.hacker_id ASC;
代码说明
- 内层子查询
challenge_max_scores:负责计算每个黑客在每个挑战中的最高得分,确保每个挑战只取一次最高分。 - 中间子查询
hacker_totals:对每个黑客的所有挑战最高分求和,并用HAVING total_score > 0排除总分为0的黑客。 - 外层查询:关联
Hackers表获取姓名,最后按题目要求的排序规则输出结果。
内容的提问来源于stack exchange,提问作者Khushi Mittal
相关产品推荐
相关产品推荐

