【发布时间】:2019-06-14 13:39:25
【问题描述】:
我正在使用 MySQL,目前正试图了解一段代码的工作原理。这是关于Hackerrank SQL question titled "Challenges"。问题陈述如下
Julia 要求她的学生创造一些编码挑战。写一个 查询以打印hacker_id、名称和挑战总数 由每个学生创建。按总人数对结果进行排序 挑战按降序排列。如果不止一名学生创建了 相同数量的挑战,然后按hacker_id对结果进行排序。如果更多 比一个学生创造了相同数量的挑战和计数 小于创建的最大挑战数,则排除 结果中的那些学生。
我找到了一个有效的 MySQL 解决方案 courtesy of this page,它使用以下代码:
SELECT c.hacker_id, h.name, COUNT(c.challenge_id) AS cnt
FROM Hackers AS h JOIN Challenges AS c ON h.hacker_id = c.hacker_id
GROUP BY c.hacker_id, h.name HAVING
cnt = (SELECT COUNT(c1.challenge_id) FROM Challenges AS c1 GROUP BY c1.hacker_id ORDER BY COUNT(*) DESC LIMIT 1) OR
cnt NOT IN (SELECT COUNT(c2.challenge_id) FROM Challenges AS c2 GROUP BY c2.hacker_id HAVING c2.hacker_id <> c.hacker_id)
ORDER BY cnt DESC, c.hacker_id;
到目前为止,我理解问题陈述,直到“如果多个学生创建了相同数量的挑战并且计数小于创建的挑战的最大数量,则将这些学生排除在结果。”我根本不知道如何构建查询来解决该语句。
在上面提供的代码中,我理解它在本节之前所做的一切
cnt NOT IN (SELECT COUNT(c2.challenge_id) FROM Challenges AS c2 GROUP BY c2.hacker_id HAVING c2.hacker_id <> c.hacker_id)
谁能帮我理解这条线完成了什么以及它背后的逻辑?具体来说,我不知道 c2.hacker_id c.hacker_id 应该做什么。我猜整行选择了由不是同一个人的特定hacker_ids完成的challenge_ids的数量,但我不知道如何解决查询。
【问题讨论】:
-
c2.hacker_id <> c.hacker_id这里<>表示!= (not equals to) -
请告诉我们正在使用的 MySQL HackerRank 版本。如果您可以访问 MySQL 8+,您的问题将大大简化。
标签: mysql