当前位置: 首页 > 面试题库 >

MySQL的。如何使用自我加入

岳曦
2023-03-14
问题内容

我需要在此表上使用“自我联接”。

+------------+------+--------+
| Country    | Rank |  Year  |
+------------+------+--------+
|France      |  55  |  2000  |
+------------+------+--------+
|Canada      |  30  |  2000  |
+------------+------+--------+ 
|Liberia     |  59  |  2001  |
+------------+------+--------+ 
|Turkey      |  78  |  2000  |
+------------+------+--------+ 
|Japan       |  65  |  2003  |
+------------+------+--------+
|Romania     |  107 |  2001  |
+------------+------+--------+

我需要使用自我加入来获得与土耳其同年的国家。仅显示国家和年份。

这就是我想要做的。

SELECT DISTINCT a.Country, a.Year 
FROM table1 AS a, table1 AS b 
WHERE a.Year=b.Year and a.Country='Turkey';

^谷歌自我加入,并做到了。

我只得到土耳其。我究竟做错了什么?


问题答案:

你好亲密!

因为您说的是显示A的国家和年份,并限制了A. Country土耳其,所以您将只看到土耳其。您需要将selects更改为B.countryand
B.year或将where子句更改为B.country

这是使用交叉联接的,表中的记录越多,交叉联接的速度就会越慢。

SELECT DISTINCT b.Country, b.Year 
FROM table1 AS a, 
     table1 AS b 
WHERE a.Year=b.Year 
  and a.Country='Turkey';

可以写为…,并且可能具有相同的执行计划。

SELECT DISTINCT b.Country, b.Year 
FROM table1 AS a 
CROSS JOIN table1 AS b 
WHERE a.Year=b.Year 
  and a.Country='Turkey';

或这使用了INNER JOIN,它限制了引擎必须完成的工作,并且不会遭受交叉联接可能导致的性能下降。

SELECT DISTINCT a.Country, a.Year 
FROM table1 AS a 
INNER JOIN table1 AS b 
   on a.Year=b.Year 
  and b.Country='Turkey';

为什么:

考虑一下AB发生联接时SQL引擎将做什么

+------------+------+--------+------------+------+--------+
| A.Country  | Rank |  Year  | B.Country  | Rank |  Year  |
+------------+------+--------+------------+------+--------+
|France      |  55  |  2000  |France      |  55  |  2000  |
+------------+------+--------+------------+------+--------+
|Canada      |  30  |  2000  |France      |  55  |  2000  |
+------------+------+--------+------------+------+--------+ 
|Turkey      |  78  |  2000  |France      |  55  |  2000  |
+------------+------+--------+------------+------+--------+ 
|France      |  55  |  2000  |Canada      |  30  |  2000  |
+------------+------+--------+------------+------+--------+
|Canada      |  30  |  2000  |Canada      |  30  |  2000  |
+------------+------+--------+------------+------+--------+ 
|Turkey      |  78  |  2000  |Canada      |  30  |  2000  |
+------------+------+--------+------------+------+--------+ 
|France      |  55  |  2000  |Turkey      |  78  |  2000  |
+------------+------+--------+------------+------+--------+
|Canada      |  30  |  2000  |Turkey      |  78  |  2000  |
+------------+------+--------+------------+------+--------+ 
|Turkey      |  78  |  2000  |Turkey      |  78  |  2000  |
+------------+------+--------+------------+------+--------+

因此,当您说展示广告A.Country以及土耳其A.Year在哪里时A.Country,您可以看到它可以返回的全部是土耳其(由于唯一的1条记录)

但是,如果您选择的B.Country是土耳其并展示A.Country,您将获得法国,加拿大和土耳其!



 类似资料:
  • 问题内容: 我最近问了一个有关“自我加入”的问题,得到了一个很好的答案。 该查询用于查找事件1之后1天的事件2的ID,开始日期和价格。 该代码工作正常。 但是我不知道如何。 有人可以尽可能详尽地解释一下-查询的不同部分是什么以及它们做什么? 非常感谢您的帮助,无论出于什么原因,我都很难解决这个问题。 问题答案: 我试图理解的方式是在第一块上写出两个列表,分别标记为event1和一个event2。然

  • 我需要在集合中返回以分页,但我只能在数组中返回,因为查询使用自然联接。如何使用Laravel集合执行此查询: 选择男性。*从mensagens自然加入(选择id_emissor,最大(created_at)created_at从mensagensid_receptor="。$user_id"集团id_emissor)t 我用过这个代码:

  • 问题内容: 如何通过在alter上输入值来添加该列?作为示例,我想在每行上添加 tempID 的列,该列的值为“ 3” 也许是这样的 但是上面的代码仅用于时间戳,不适用于整数值。提前致谢 问题答案: 您应该查看此https://dev.mysql.com/doc/refman/5.7/en/alter- table.html 对于您的情况,它将类似于

  • 我最初调用了数据库,并使用了Definer中的表,在它上运行一些查询,这些查询存储在dataframe'data1'中。现在我想发送包含一个新列的'data1',并更新MySQL中的非空表exdata3。 (将来我可能没有新的列/行,但与MySQL中的相同列相比,现有列在dataframe中可能有不同的值,如果您知道我的意思的话) 在MySQL中,dataframe和表之间的区别是在datafra

  • 问题内容: 我不太确定是否由于尝试执行以下MySQL程序而关闭了与此类似的问题。 在bash命令行上并得到此错误 我该如何解决此问题? 我实际上是从Python程序运行此命令,但将其拉出以尝试在bash命令行上摆弄它。 我已经看到了如何修改my.cnf(本地文件),但是如果可以避免的话,我不希望对全局进行更改。 这是MySQL版本。 问题答案: 如“ 安全问题”中所述: 为了解决这些问题,我们更改

  • 问题内容: 我有一个PreparedStatement,例如: 如您所见,Employee表具有一个自动递增的ID。我基本上也需要使用prepareStatement自动添加它。有人可以告诉我我要去哪里哪里并纠正我吗?现在,这只是给我一个与Statement相关的错误。 问题答案: 将该列 完全 放在语句之外。它将由数据库引擎生成。您的查询应为: __ 其次,您必须先执行插入操作,然后再从结果中取