Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 需要了解计数和运算符的帮助(Hackerrank SQL挑战问题)_Mysql - Fatal编程技术网

Mysql 需要了解计数和运算符的帮助(Hackerrank SQL挑战问题)

Mysql 需要了解计数和运算符的帮助(Hackerrank SQL挑战问题),mysql,Mysql,我正在使用MySQL,目前一直在试图理解一段代码是如何工作的。这是关于。问题陈述如下 Julia要求她的学生创造一些编码挑战。写一篇 查询以打印黑客id、姓名和挑战总数 由每个学生创建。将结果按总数排序 挑战按降序排列。如果一个以上的学生创建了 相同数量的挑战,然后按黑客id对结果进行排序。如果更多 不止一个学生创造了相同数量的挑战和计数 小于创建的最大挑战数,则排除 那些学生从结果中受益 我发现了一个使用以下代码的MySQL解决方案: SELECT c.hacker_id, h.name, C

我正在使用MySQL,目前一直在试图理解一段代码是如何工作的。这是关于。问题陈述如下

Julia要求她的学生创造一些编码挑战。写一篇 查询以打印黑客id、姓名和挑战总数 由每个学生创建。将结果按总数排序 挑战按降序排列。如果一个以上的学生创建了 相同数量的挑战,然后按黑客id对结果进行排序。如果更多 不止一个学生创造了相同数量的挑战和计数 小于创建的最大挑战数,则排除 那些学生从结果中受益

我发现了一个使用以下代码的MySQL解决方案:

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+,您的问题将大大简化。