MySql 自连接谓词不理解它是如何工作的
MySql self join predicate not understanding how it works
我正在学习自连接并且有这个简单的 table:
+-----------+-------------+
| name | location |
+-----------+-------------+
| Robert | Guadalajara |
| Manuel | Guadalajara |
| Dalia | Guadalajara |
| Alejandra | Guadalajara |
| Luis | Guadalajara |
| Monica | Guadalajara |
| Claudia | Guadalajara |
| Scartlet | Guadalajara |
| Sergio | Guadalajara |
| Rick | Mexico City |
| Rene | Mexico City |
| Ramon | Culiacan |
| Junior | Culiacan |
| Kasandra | Culiacan |
| Emma | Culiacan |
| Johnatha | Dunedin |
| Miriam | Largo |
| Julie | Largo |
+-----------+-------------+
我们的目的是找到所有与 'Robert' 共享相同位置的人。
使用自联接,我通过阅读此处的解决方案看到了以下工作,但是,我不明白发生了什么,如果他们问我它是如何工作的,我将无法向其他人解释它:
SELECT users1.name
FROM users users1, users users2
WHERE users1.location = users2.location
AND users2.name = 'Robert';
正确地return得到以下结果:
+-----------+
| name |
+-----------+
| Robert |
| Manuel |
| Dalia |
| Alejandra |
| Luis |
| Monica |
| Claudia |
| Scartlet |
| Sergio |
+-----------+
我不明白的是 AND users2.name = 'Robert'
如何在 return 获得正确结果中发挥作用。
有人可以逐步解释 MySql 如何处理 table 表达式和谓词:
WHERE users1.location = users2.location
AND users2.name = 'Robert';
到return正确的结果。
我实际上更喜欢在自连接中使用显式语法,这样可以更容易地看出您实际上是在将两个 table 连接在一起(在本例中是 table 本身) :
SELECT u2.name
FROM users u1 INNER JOIN users u2
ON u1.location = u2.location
WHERE u1.name = 'Robert'
一张图片胜过一千个字,下面是上面查询中创建的临时 table 的样子:
+-----------+-------------+-----------+-------------+
| u1.name | u1.location | u2.name | u2.location |
+-----------+-------------+-----------+-------------+
| Robert | Guadalajara | Robert | Guadalajara |
| Robert | Guadalajara | Manuel | Guadalajara |
| Robert | Guadalajara | Dalia | Guadalajara |
| Robert | Guadalajara | Alejandra | Guadalajara |
| Robert | Guadalajara | Luis | Guadalajara |
| Robert | Guadalajara | Monica | Guadalajara |
| Robert | Guadalajara | Claudia | Guadalajara |
| Robert | Guadalajara | Scarlet | Guadalajara |
| Robert | Guadalajara | Sergio | Guadalajara |
+-----------+-------------+-----------+-------------+
查询将第一个 users
table 中的每个位置连接到第二个 users
table 中的每个匹配位置。 WHERE
子句仅限于第一个 table.
中名为 'Robert'
的用户
我正在学习自连接并且有这个简单的 table:
+-----------+-------------+
| name | location |
+-----------+-------------+
| Robert | Guadalajara |
| Manuel | Guadalajara |
| Dalia | Guadalajara |
| Alejandra | Guadalajara |
| Luis | Guadalajara |
| Monica | Guadalajara |
| Claudia | Guadalajara |
| Scartlet | Guadalajara |
| Sergio | Guadalajara |
| Rick | Mexico City |
| Rene | Mexico City |
| Ramon | Culiacan |
| Junior | Culiacan |
| Kasandra | Culiacan |
| Emma | Culiacan |
| Johnatha | Dunedin |
| Miriam | Largo |
| Julie | Largo |
+-----------+-------------+
我们的目的是找到所有与 'Robert' 共享相同位置的人。
使用自联接,我通过阅读此处的解决方案看到了以下工作,但是,我不明白发生了什么,如果他们问我它是如何工作的,我将无法向其他人解释它:
SELECT users1.name
FROM users users1, users users2
WHERE users1.location = users2.location
AND users2.name = 'Robert';
正确地return得到以下结果:
+-----------+
| name |
+-----------+
| Robert |
| Manuel |
| Dalia |
| Alejandra |
| Luis |
| Monica |
| Claudia |
| Scartlet |
| Sergio |
+-----------+
我不明白的是 AND users2.name = 'Robert'
如何在 return 获得正确结果中发挥作用。
有人可以逐步解释 MySql 如何处理 table 表达式和谓词:
WHERE users1.location = users2.location
AND users2.name = 'Robert';
到return正确的结果。
我实际上更喜欢在自连接中使用显式语法,这样可以更容易地看出您实际上是在将两个 table 连接在一起(在本例中是 table 本身) :
SELECT u2.name
FROM users u1 INNER JOIN users u2
ON u1.location = u2.location
WHERE u1.name = 'Robert'
一张图片胜过一千个字,下面是上面查询中创建的临时 table 的样子:
+-----------+-------------+-----------+-------------+
| u1.name | u1.location | u2.name | u2.location |
+-----------+-------------+-----------+-------------+
| Robert | Guadalajara | Robert | Guadalajara |
| Robert | Guadalajara | Manuel | Guadalajara |
| Robert | Guadalajara | Dalia | Guadalajara |
| Robert | Guadalajara | Alejandra | Guadalajara |
| Robert | Guadalajara | Luis | Guadalajara |
| Robert | Guadalajara | Monica | Guadalajara |
| Robert | Guadalajara | Claudia | Guadalajara |
| Robert | Guadalajara | Scarlet | Guadalajara |
| Robert | Guadalajara | Sergio | Guadalajara |
+-----------+-------------+-----------+-------------+
查询将第一个 users
table 中的每个位置连接到第二个 users
table 中的每个匹配位置。 WHERE
子句仅限于第一个 table.
'Robert'
的用户