我正在尝试自己练习sql,并且正在解决hackerrank网站上的问题。 我遇到了这个名为“Ollivander's Inventory”的问题(如果您想除了我的解释之外详细查看该问题,请点击此处的链接https://www.hackerrank.com/challenges/harry-potter-and-wands/problem)
问题如下
“哈利·波特和他的 friend 们和罗恩一起在奥利凡德家,终于取代了查理那根坏掉的旧魔杖。
赫敏决定最好的选择方法是确定购买每根高功率和年龄的非邪恶魔杖所需的最小金加隆数量。编写一个查询来打印 Ron 感兴趣的魔杖的 id、年龄、coins_needed 和力量,并按力量降序排列。如果有多根魔杖具有相同的力量,则按年龄降序对结果进行排序。”
我找到了与我的代码非常接近的解决方案,但该解决方案中仍然有一部分我不理解。代码是:
Select w.id,wp.age,w.coins_needed,w.power
from wands as w
INNER JOIN wands_property as wp
on w.code=wp.code
Where wp.is_evil!=1 AND w.coins_needed=(Select min(Wands.coins_needed)
from Wands
inner join Wands_Property
on Wands.code=Wands_Property.code
where Wands_Property.age=wp.age and Wands.power=w.power)
order by w.power desc, wp.age desc;
我不明白这部分代码。
AND w.coins_needed=(Select min(Wands.coins_needed)
from Wands
inner join Wands_Property
on Wands.code=Wands_Property.code
where Wands_Property.age=wp.age and Wands.power=w.power)
据我所知(如果我错了请纠正我)我们可以使用 min(wands.coins_needed)
在查询的开头,因为之后我们需要使用 group by
条款,它会导致 w.id
出现问题。 但是我们使用另一个的原因是什么 join
之后 w.coins_needed=(Select min(Wands.coins_needed)
?任何帮助都会得到帮助。请告诉我我的想法哪里错了。
谢谢!
最佳答案
好吧,你可能明白这一点,但为了清楚并完整地回答,查询(基于赫敏的建议)列出了所有列出的魔杖的力量和年龄的每一种组合,但是当不止一根魔杖具有同等功率同年龄,只列出最便宜的。
外部查询正在遍历所有魔杖。
内部查询将查询所有具有相同功率和年龄的其他魔杖,以找到最便宜的价格。
为此,内部查询需要从外部查询获取“当前”魔杖的力量和生命周期。
要查询具有相同功率和生命周期的所有魔杖,我们需要连接 Wands
和 Wands_Property
表。这就是答案。我们需要两个表来匹配内部查询中的力量和年龄,以寻找所有同等魔杖的最便宜价格。
一旦我们知道了可以得到具有给定能力和年龄的魔杖的最便宜价格,我们就可以在 WHERE
子句中设置一个条件来仅显示这些魔杖。
关于mysql - 尝试理解联接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60420130/