我无法在hackerrank 上解决这个问题,不得不查找解决方案。我加入了错误的表格。
有4张桌子:
- 黑客
- 挑战
- 黑客提交的内容及其分数
- 难度表与水平。
任务描述:
编写查询以打印在多个挑战中获得满分的黑客的相应hacker_id 和名称。
提交表字段:submission_id、hacker_id、challenge_id、score
挑战表字段:challenge_id、hacker_id、难度级别
我加入的方式:黑客+挑战,挑战+难度,挑战+提交。
select
hackers.hacker_id, name
from submissions inner join challenges on submissions.challenge_id = challenges.challenge_id
inner join difficulty on difficulty.difficulty_level = challenges.difficulty_level
inner join hackers on
challenges.hacker_id = hackers.hacker_id -- here is wrong part!
where difficulty.score = submissions.score and difficulty.difficulty_level = challenges.difficulty_level
group by hackers.hacker_id, name
having count( challenges.challenge_id)> 1
order by count( challenges.challenge_id) desc, hackers.hacker_id
然而,正确的方法几乎是一样的——除了我应该加入提交+hacker_id的黑客而不是提交+challenge_id的挑战。
正确的方法:
select
hackers.hacker_id,name
from submissions inner join challenges on submissions.challenge_id = challenges.challenge_id
inner join difficulty on difficulty.difficulty_level = challenges.difficulty_level
inner join hackers on submissions.hacker_id = hackers.hacker_id
where difficulty.score = submissions.score and difficulty.difficulty_level = challenges.difficulty_level
group by hackers.hacker_id, name
having count( challenges.challenge_id)> 1
order by count( challenges.challenge_id) desc, hackers.hacker_id
通过challenge_id加入提交+挑战与通过hacker_id加入提交+黑客背后的逻辑是什么?
为什么会产生不同的结果?黑客提交,所以无论我是加入挑战+提交+黑客还是提交+黑客+挑战......
这有点猜测,因为您没有提供挑战的链接(在降价中,您必须制作链接,[this problem](http://whatever.com)
但单击您的链接只需要 http://this%20problem,所以我猜降价已损坏你说过你有桌子:
所以我们可以清楚地有“一个黑客可能会回答很多挑战”和“一个挑战有很多黑客回答它”,即很多关系,所以我们需要一个中间的表格来拆分它并跟踪哪个黑客回答了哪个挑战,这个提交表是否在进行此细分
这里有趣的部分,可能是故意把人们绊倒的,是挑战也有一个黑客 ID 列。出于某种原因,黑客等级的表格跟踪与提交无关的黑客挑战关系,即挑战表中的黑客 ID 是只有一个黑客可以参与该挑战的东西,例如创建它的黑客,或者最先获得满分的黑客,或者负责在上面标记答案的黑客,或者最近拿下它的黑客。
不管是什么原因,你说你加入了那个黑客ID,在我看来这是错误的事情,因为它与多个黑客提交的问题无关:可能是黑客
challenge.hacker_id
甚至从未做过提交的挑战,他们只是写了它,从来没有回答过。因此,它不能给你挑战所寻求的答案。这可能是为了让你知道,这也是我在设计数据库模式时打算在这种情况下将列的原因放入其名称中的原因之一;即在挑战表中,我可能会调用它author_hackerid
或moderator_hackerid
不仅要描述它链接到的位置(黑客 ID 上的黑客表),还要描述它为什么链接到那里(作者、版主、firstwinner、recenttaker),尤其是在有多个人的情况下..(尽管在这种情况下,拥有可能更有意义另一个表,如提交),将黑客和挑战分开,并给出该黑客与该挑战相关的原因)请记住,仅仅因为两列的名称相同,并不意味着它们是替代连接选项。如果是左连接,即使之前参与过连接的列也不能替代。如果是内部连接,公平游戏:
但这些可能会产生不同的结果:
两个表的第二个查询中的微小但关键的差异左连接到 a 可能是巨大的