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 ответ:
На самом деле я предпочитаю использовать явный синтаксис в самосоединении, что облегчает понимание того, что вы на самом деле объединяете две таблицы (или таблицу к себе в данном случае):
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'
в первый столик.