MySql self join предикат не понимая, как это работает


Я изучаю самосоединения и у меня есть такая простая таблица:

+-----------+-------------+
| 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       |
+-----------+-------------+
Предполагалось найти всех людей, которые живут в одном месте с "Робертом".

Используя self joins я увидел, что следующие работы из чтения о решениях здесь, но, я не понимаю, что происходит, и не смог бы объяснить это другому, если бы они спросили меня, как это работает:

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';

Чтобы вернуть правильный результат.

1 2

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' в первый столик.