множественные ОБЪЕДИНЕНИЯ в SQL базы данных SAKILA

#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, он не будет отображаться. Как я уже говорил, я новичок в этом языке, так что вы, вероятно, правы. В любом случае, большое вам спасибо!