MySql自加入意外结果内连接

时间:2015-07-27 02:53:40

标签: mysql sql self-join

我正在学习本教程中的SQL连接:http://www.programmerinterview.com/index.php/database-sql/what-is-a-self-join/

他们使用的表是:

+---------------+-------------------+
| employee_name | employee_location |
+---------------+-------------------+
| Joe           | New York          |
| Sunil         | India             |
| Alex          | Russia            |
| Albert        | Canada            |
| Jack          | New York          |
+---------------+-------------------+

我决定通过省略这样的某些部分来试验这些问题:

select * from
employee t1, employee t2
where t1.employee_location = t2.employee_location

这个查询看起来非常简单。 "匹配具有相同位置的人。我认为好,结果将是这样的:

+---------------+-------------------++---------------+-------------------+
| employee_name | employee_location || employee_name | employee_location |
+---------------+-------------------++---------------+-------------------+
| Joe           | New York          || Joe           | New York          |
| Sunil         | India             || Sunil         | India             |
| Alex          | Russia            || Alex          | Russia            |
| Albert        | Canada            || Albert        | Canada            |
| Jack          | New York          || Jack          | New York          |
+---------------+-------------------++---------------+-------------------+

但不是上面我得到了这个:

+---------------+-------------------+---------------+-------------------+
| employee_name | employee_location | employee_name | employee_location |
+---------------+-------------------+---------------+-------------------+
| Joe           | New York          | Joe           | New York          |
| Jack          | New York          | Joe           | New York          |
| Sunil         | India             | Sunil         | India             |
| Alex          | Russia            | Alex          | Russia            |
| Albert        | Canada            | Albert        | Canada            |
| Joe           | New York          | Jack          | New York          |
| Jack          | New York          | Jack          | New York          |
+---------------+-------------------+---------------+-------------------+

适用于Sunil,Alex和Albert。 Joe和Jack的组合我不明白。有人可以详细解释除解决方案之外的其他方法吗?我想了解这个结果背后的逻辑。

2 个答案:

答案 0 :(得分:1)

t1中的每一个纽约行与t2中的两行匹配,因为您要求的是城市是相同的。所以你得到纽约的2 x 2总比赛(对)。如果您添加了第三个纽约,那么您将获得9行。

要查看您期望的行为,请尝试添加and t1.employee_name = t2.employee.name。您无法单独按位置唯一标识所有人员,即使您可以使用大多数,因此您的结果几乎可以正常工作。

答案 1 :(得分:0)

答案在于"其中"声明: 其中t1.employee_location = t2.employee_location 乔和杰克都与纽约相匹配,因此成倍增加。 您可以通过添加另一个纽约条目并重新运行来更好地看到这一点。您将获得9个纽约结果。 要获得预期,您需要添加"以及t1.employee_name = t2.employee_name。