#mysql #sql #join
#mysql #sql #Присоединиться
Вопрос:
я прохожу курс SQL (MYSQL), и мне задали следующий вопрос: * «В Sakila у каждого сотрудника есть домашний адрес, и он привязан к магазину. У хранилищ тоже есть адрес. Напишите один запрос SELECT, который возвращает имя, фамилию и название города для каждого сотрудника, чей домашний адрес (staff.address_id) и адрес магазина (store.address_id) находятся в одном городе. Подсказки:
- Вам понадобится как минимум 4 соединения, чтобы все было правильно.
- В результате будут перечислены 2 сотрудника. «*
Я думал, что сделал это с помощью 3 ОБЪЕДИНЕНИЙ, используя этот запрос :
use sakila;
select distinct first_name, last_name, city
from city
join address on city.city_id = address.city_id
join staff on staff.address_id = address.address_id
join store ;
но мне сказали, что запрос неполный, даже если вывод правильный (если бы в таблице staff было больше строк, они все равно отображались бы в выходных данных — мой запрос игнорирует адреса магазинов).
вот мой вывод: мой вывод
не могли бы вы помочь мне здесь, ребята? большое вам спасибо!
Комментарии:
1. ANSI SQL имеет ON для каждого СОЕДИНЕНИЯ. Однако MySQL, опять же, делает все по-своему.
2. Базой является staff member (
staff
таблица). К нему должны быть присоединены все другие таблицы. Вы должны присоединитьсяaddress
и присоединиться, уstore
которых есть свой собственный адрес, независимый от адреса участника, поэтому необходимо присоединить копию другой независимойaddress
таблицыstore
.3. @jarlh Ах, не используя MySQL регулярно, я на самом деле этого не знал — это поражает меня тем, что, наряду с его способностью игнорировать правильную группировку, довольно плохо для новичков, особенно для обучения плохим навыкам.
Ответ №1:
SELECT staff.first_name, staff.last_name, city.city
FROM staff -- staff member
JOIN address address1 ON staff.address_id = address1.address_id -- member's address
JOIN store ON staff.store_id= store.store_id -- members' store
JOIN address address2 ON store.address_id = address2.address_id -- store's address
JOIN city ON address1.city_id = city.city_id -- member's city (may join to address2 and get store's city)
WHERE address1.city_id = address2.city_id -- check that member's city and store's city is the same city
first_name last_name город Майк Хиллер Летбридж Джон Стивенс Вудридж
https://dbfiddle.uk/?rdbms=mysql_8.0amp;sample=sakilaamp;fiddle=bb4292dc30784ffbdc547e1daa1bf03c
Комментарии:
1. вау, большое вам спасибо! Последний вопрос, не означает ли это положение В staff.store_id= store.store_id, что сотрудник должен работать в магазине, с которым он делит город?
2. @Jov Нет… почему «работать»? ни одно отношение не устанавливает это.
3. Я так подумал, потому что вы объединяете их по идентификатору хранилища, поэтому, если один сотрудник живет в Вудридже, но назначен в хранилище lethbridge, он не будет отображаться. Как я уже говорил, я новичок в этом языке, так что вы, вероятно, правы. В любом случае, большое вам спасибо!