Mysql 需要了解计数和运算符的帮助(Hackerrank SQL挑战问题)
我正在使用MySQL,目前一直在试图理解一段代码是如何工作的。这是关于。问题陈述如下 Julia要求她的学生创造一些编码挑战。写一篇 查询以打印黑客id、姓名和挑战总数 由每个学生创建。将结果按总数排序 挑战按降序排列。如果一个以上的学生创建了 相同数量的挑战,然后按黑客id对结果进行排序。如果更多 不止一个学生创造了相同数量的挑战和计数 小于创建的最大挑战数,则排除 那些学生从结果中受益 我发现了一个使用以下代码的MySQL解决方案:Mysql 需要了解计数和运算符的帮助(Hackerrank SQL挑战问题),mysql,Mysql,我正在使用MySQL,目前一直在试图理解一段代码是如何工作的。这是关于。问题陈述如下 Julia要求她的学生创造一些编码挑战。写一篇 查询以打印黑客id、姓名和挑战总数 由每个学生创建。将结果按总数排序 挑战按降序排列。如果一个以上的学生创建了 相同数量的挑战,然后按黑客id对结果进行排序。如果更多 不止一个学生创造了相同数量的挑战和计数 小于创建的最大挑战数,则排除 那些学生从结果中受益 我发现了一个使用以下代码的MySQL解决方案: SELECT c.hacker_id, h.name, C
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\u id c.hacker\u id应该做什么。我猜整行代码都选择了特定黑客ID所做的挑战ID的数量,这些黑客ID不是同一个人,但我不知道这是如何解决查询的。分析函数对这样的问题非常有帮助,因此我将使用MySQL 8+提供一个解决方案,您的问题的读者可能会使用的数据库,HackerRank在某个时候也会使用MySQL 8+
WITH cte AS (
SELECT
c.hacker_id,
h.name,
COUNT(c.challenge_id) AS cnt,
ROW_NUMBER() OVER (ORDER BY COUNT(c.challenge_id) DESC) rn,
MIN(c.hacker_id) OVER (PARTITION BY COUNT(c.challenge_id)) hacker_id_min,
MAX(c.hacker_id) OVER (PARTITION BY COUNT(c.challenge_id)) hacker_id_max
FROM Hackers AS h
INNER JOIN Challenges AS c
ON h.hacker_id = c.hacker_id
GROUP BY
c.hacker_id,
h.name
)
SELECT
hacker_id,
name,
cnt
FROM cte
WHERE
rn = 1 OR hacker_id_min = hacker_id_max
ORDER BY
cnt DESC,
c.hacker_id;
这个答案是通过计算一个行号来回答单词的,行号按计数降序排列。它还计算每个挑战计数分区的最小和最大黑客id值。如果记录属于最高计数,则将保留记录,而不考虑排名第一的情况。如果给定的计数仅与单个用户关联,则也会保留记录。假设您在没有此子句的情况下从查询中获得黑客ID和子计数的列表:
hacker, counter
1, 10
2, 9
3, 9
2和3不应该在那里,因为它们在计数上是并列的,所以我们可以将其实现为排除任何计数为9的人
从概念上考虑,数据库将对结果中的每一行运行查询:当处理hacker 2行时,查询将获得一个挑战计数列表,其中id不是2的人。这意味着在考虑黑客2时,dB将撤回以下计数的列表:
10, --it comes from hacker 1
9 --it comes from hacker 3
数据库开始运行,我正在处理黑客2,其计数为9。如果hacker2的count9不在下面的值列表中,我可能只在结果中包括hacker2:10,9。哦,9在禁止值列表中。我将从结果中排除黑客2
对黑客3重复此操作,这一次9计数来自黑客2,因此3也被排除在外c2.hacker\u id c.hacker\u id这里的意思是!=请告诉我们MySQL HackerRank使用的是什么版本。如果您能够访问MySQL 8+,您的问题将大大简化。