【问题标题】:Meaning of this line: HAVING c2.hacker_id <> c.hacker.id?此行的含义: HAVING c2.hacker_id <> c.hacker.id?
【发布时间】:2019-07-18 08:04:36
【问题描述】:

我一直在研究一个 HackerRank SQL 问题,"Challenges"

这就是问题所在:

Julia 要求她的学生创造一些编码挑战。编写查询以打印hacker_id、姓名和每个学生创建的挑战总数。按挑战总数降序排列您的结果。如果多个学生创建了相同数量的挑战,则按hacker_id 对结果进行排序。如果多个学生创建了相同数量的挑战,并且计数小于创建的最大挑战数量,则将这些学生排除在结果之外。

这个问题把我难住了,我正在网上搜索其他人是如何解决它的,这时我遇到了这个Github here,他提出了一个非常优雅的解决方案。

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;

我了解发帖者如何确保我们在 HAVING 的第一个条件下只能获得最大数量的挑战,但至于第二部分,我不太明白。我不确定为什么 HAVING 查询的第二个条件有效: HAVING c2.hacker_id c.hacker_id

不会总是 c2.hacker_id = c.hacker_id 吗?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    如果你均衡它们 (c2.hacker_id = c.hacker_id),结果与相同的 hacker_id 相关。在不等式条件下,它不包括hacker_id 本身。这意味着计算hacker_id 不等于外部查询的hacker_id 的挑战数,并从主查询中排除这些计数。

    【讨论】:

    • 但是如果内部查询C2中的hacker_id和外部查询c的hacker_id来自同一个表--challenge--那么hacker_ids不总是相等的吗?
    • @psychodramandy 一点也不。 SELECT ... FROM Challenges AS c2 与外部查询不相关。它从完整表Challenges 的第二个逻辑实例中选择所有行,如果有一个名为Challenges2 的表具有Challenges 中数据的完整副本,则没有什么不同。您似乎假设存在隐式相关WHERE c2.hacker_id = c.hacker_id,而这里没有类似的东西。
    猜你喜欢
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-16
    • 2014-01-21
    • 1970-01-01
    • 2023-03-15
    • 2010-11-14
    相关资源
    最近更新 更多