【问题标题】:MySql self join predicate not understanding how it worksMySql 自联接谓词不了解它是如何工作的
【发布时间】:2015-07-24 10:42:41
【问题描述】:

我正在学习自联接并有这个简单的表:

+-----------+-------------+
| 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       |
+-----------+-------------+

我们的目的是找到所有与“罗伯特”位于同一位置的人。

使用自我加入,我看到以下工作是通过阅读此处的解决方案,但是,我不明白发生了什么,如果他们问我它是如何工作的,我也无法向其他人解释:

SELECT users1.name
FROM users users1, users users2
WHERE users1.location = users2.location
AND users2.name = 'Robert';

正确返回如下结果:

+-----------+
| name      |
+-----------+
| Robert    |
| Manuel    |
| Dalia     |
| Alejandra |
| Luis      |
| Monica    |
| Claudia   |
| Scartlet  |
| Sergio    |
+-----------+

我不明白具体是AND users2.name = 'Robert' 在返回正确结果中的作用。

谁能一步一步解释MySql如何处理表表达式和谓词:

WHERE users1.location = users2.location
AND users2.name = 'Robert';

返回正确的结果。

【问题讨论】:

  • 请查看下面给出的答案,谢谢。

标签: mysql self-join


【解决方案1】:

我实际上更喜欢在自联接中使用显式语法,这样更容易看出您实际上是在将两个表(或者在这种情况下是一个表自身)联接在一起:

SELECT u2.name
FROM users u1 INNER JOIN users u2
ON u1.location = u2.location
WHERE u1.name = 'Robert'

一张图胜过千言万语,所以上面查询中创建的临时表是这样的:

+-----------+-------------+-----------+-------------+
| 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 表中的每个位置连接到第二个users 表中的每个匹配位置。 WHERE 子句仅限于第一个表中名为 'Robert' 的用户。

【讨论】:

  • 感谢您的回答。尽管如此,我仍然不明白我的查询以及它为什么以及如何工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多