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

MySQL ERROR 1247报错求助:HackerRank竞赛排行榜SQL查询问题

问题分析与解决方案

代码错误点

  • 语法错误:HAVING子句无法直接引用SELECT中定义的别名total,MySQL不支持这种用法;子查询里的sum(total)中的total未定义,直接触发报错。
  • 逻辑错误:
    1. 直接使用sum(s.score)会累加黑客所有提交的得分,而题目要求是每个挑战取最高得分后再求和,完全不符合需求。
    2. 子查询的嵌套逻辑混乱,试图用in匹配的思路完全没必要,属于绕远路且逻辑错误。

正确解决思路

要满足题目要求,需要分三步处理:

  1. 先提取每个黑客在每个挑战中的最高得分:按hacker_id和challenge_id分组,用MAX(score)得到单挑战最高分。
  2. 基于第一步的结果,按hacker_id分组求和,得到每个黑客的总得分,同时过滤掉总得分0的记录。
  3. 将上述结果与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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 10:33:23