Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.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 试图理解连接_Mysql_Sql_Sql Server - Fatal编程技术网

Mysql 试图理解连接

Mysql 试图理解连接,mysql,sql,sql-server,Mysql,Sql,Sql Server,我试图自己练习sql,我正在解决hackerrank网站上的问题。 我遇到了一个名为奥利凡德的清单的问题,如果你想看到这个问题的详细信息而不是我的解释,这里有一个链接 问题是 哈利·波特和他的朋友们和罗恩一起来到奥利凡德家,终于更换了查理的旧魔杖 赫敏决定,最好的选择是确定购买每一根高能量和高年龄的非邪恶魔杖所需的最小黄金加伦数量。写一个查询,打印罗恩感兴趣的魔杖的id、年龄、所需硬币和权值,按权值降序排列。如果一根以上的魔杖具有相同的力量,则按年龄递减的顺序对结果进行排序 我发现这个解决方案与

我试图自己练习sql,我正在解决hackerrank网站上的问题。 我遇到了一个名为奥利凡德的清单的问题,如果你想看到这个问题的详细信息而不是我的解释,这里有一个链接

问题是

哈利·波特和他的朋友们和罗恩一起来到奥利凡德家,终于更换了查理的旧魔杖

赫敏决定,最好的选择是确定购买每一根高能量和高年龄的非邪恶魔杖所需的最小黄金加伦数量。写一个查询,打印罗恩感兴趣的魔杖的id、年龄、所需硬币和权值,按权值降序排列。如果一根以上的魔杖具有相同的力量,则按年龄递减的顺序对结果进行排序

我发现这个解决方案与我的代码非常接近,但仍然有一部分我不理解。代码是:

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)
如我所知,如果我错了,请纠正我,我们不能在查询开始时使用minwands.coins\u,因为在wards之后,我们需要使用group by子句,这将导致w.id出现问题。但是为什么我们在w.coins\u needed=Select minWands.coins\u needed之后使用另一个连接呢?任何帮助都将受到感谢。请告诉我我哪里想错了


谢谢

好的,你可能理解这一点,但为了清楚和完整地回答,根据赫敏的建议,这个问题是列出所有列出的魔杖的每一种力量和年龄组合,但是当不止一根魔杖具有相同的力量和年龄时,只列出最便宜的一根

外部查询正在通过所有的魔杖

内部查询将查询具有相同功率和使用年限的所有其他魔杖,以找到最便宜的价格

为此,内部查询需要从外部查询获取当前魔杖的力量和年龄

要查询具有相同功率和年龄的所有魔杖,我们需要加入魔杖和魔杖属性表。这就是答案。在我们的内部查询中,我们需要两个表来匹配功率和年龄,以寻找所有同等魔杖中最便宜的价格


一旦我们知道了最便宜的价格,我们可以得到一个具有给定功率和年龄的魔杖,我们可以在WHERE条款中有一个条件,只显示那些魔杖。

我不确定你的例子想做什么-我觉得它有一个bug。以下是我将如何做到这一点——因为我认为这一点很清楚:

SELECT w.id, wp.age, w.coins_needed, w.power
FROM wands as w
JOIN wands_property as wp on w.code=wp.code
JOIN (
  SELECT wp.age, w.power, min(w.coins_needed) as c
  FROM wands as w
  JOIN wands_property as wp on w.code=wp.code
  WHERE wp.is_evil != 1
  GROUP BY wp.age, w.power
) mi on wp.age = mi.age and w.power = mi.power and w.coins_needed = mi.c
WHERE wp.is_evil != 1
我使用相同的基本联接来获得所有组合,但在联接表中,我使用分组方式,以获得最小的成本。然后我只需返回到主查询以获得结果

您还可以使用窗口功能-如下所示:

SELECT id, age, coins_needed, power
FROM (
  SELECT w.id, wp.age, w.coins_needed, w.power
       ROW_NUMBER(PARTITION BY wp.age, w.power ORDER BY w.coins_needed ASC) AS RN
  FROM wands as w
  JOIN wands_property as wp on w.code=wp.code
  WHERE wp.is_evil != 1
) X
WHERE RN = 1

我正在努力理解你写的第一段代码。我是新来的,所以如果问题很愚蠢,请原谅。1使用联接时,如果不指定联接的类型,会发生什么情况。wp.age=mi.age和w.power=mi.power和w.coins_needed=mi.c上的左、右、内、满2 mi是内部查询的别名吗?谢谢。内部连接和连接是一样的。是的,我没有把AS放在mi之前。对我来说,使用join作为内部连接和left join作为left join更清晰。最常用的是内部联接,因此这是默认值,当使用左联接时,可以清楚地看到,因为有两个关键字。大多数人在他们的代码中省略了inner——事实上,经常看到inner关键字表示某人是SQL新手