Как грамотно сделать выборку из нескольких таблиц (более 2-х: из 3-х, 4-х, 5-ти и тд.) на приведенном примере? - MySQL
Формулировка задачи:
Здравствуйте!
В MySQL несилен, только недавно приступил к изучению
Имеется три таблицы:
film
id filmname year
1 Фильм1 2006
2 Фильм2 2006
3 Фильм3 2005
Первичный ключ -id
hero
id heroame
1 Имя_Героя_1
2 Имя_Героя_2
3 Имя_Героя_3
Первичный ключ -id
И промежуточная таблица для связки обеих
film_hero
film_id hero_id
1 3
2 1
3 2
Первичный ключ - строка film_id и hero_id , в связке
То есть таблица создавалась запросом
строка 4, PRIMARY KEY: -
Задача - вывести таблицу, где в левом столбце - название фильма (filmname), а в правом - имя героя (heroame) на основании промежуточной, результирующей, объединяющей таблицы film_hero, связывающей
Я сделал запрос (опытным путём его вывел)
Запрос1
Получил результат
filmname heroame
Фильм1 Имя_Героя_3
Фильм2 Имя_Героя_1
Фильм3 Имя_Героя_2
Вроде все верно
Потом хочу получить Фильм в Котором есть определённая роль Задача2
Если указываю id из hero.id - то вроде все верно показывает
Запрос2
Вывод
filmname heroame
Фильм1 Имя_Героя_3
Но если мне надо искать именно по имени героя, а не id (так удобнее)
То при запросе
Запрос3
ничего не выводит! - И ошибку не создает
Вопрос:
1.) В Запросе1 я вынужден был использовать костыли- только чего знаю, и у меня ощущение что я через пень колоду запрос вывел, исходя из заданной задачи, и умеючи его можно было другим, более изящным запросом вывести, осуществить, решить задачу, - не подскажете- Каким?
2.) В Запросе 3 - что не так, что неверно? Почему по hero.id из запроса 2 - выводит корректно, что мне надо, а по запросу 3 - пустое поле выдает, ничего.
3.)Я создавая таблицу промежуточную назвал столбцы как film_id и hero_id
3.1)Можно ли их было назвать film.id и hero.id,
Или с точки зрения языка MySQL - это некорректно и вызовет конфликт?
3.2)Если - можно, - то насколько нужно их так назвать
3.3)Как вообще лучше было бы назвать столбцы промежуточной таблицы film_hero.
Спасибо!
Буду благодарен если ответите на все 5 вопросов
PRIMARY KEY (film_id, hero_id)
Листинг программы
- CREATE TABLE film_hero (
- film_id INT NOT NULL,
- hero_id INT NOT NULL,
- PRIMARY KEY (film_id, hero_id)
- ) DEFAULT CHARACTER SET utf8 ENGINE=InnoDB
Листинг программы
- select filmname, heroname
- from film, hero, film_hero
- where film_id=film.id and hero_id=hero.id
Листинг программы
- select filmname, heroname
- from film, hero, film_hero
- where film_id=film.id and hero_id=hero.id and hero.id =3
Листинг программы
- select filmname, heroname
- from film, hero, film_hero
- where film_id=film.id and hero_id=hero.id and hero.heroname="Имя_Героя_3"
Решение задачи: «Как грамотно сделать выборку из нескольких таблиц (более 2-х: из 3-х, 4-х, 5-ти и тд.) на приведенном примере?»
textual
Листинг программы
- create table f (
- id int,
- fdsc char(15),
- g int,
- constraint fpk_id primary key (id)
- ) default character set = cp1251;
- insert into f values (1, 'Фильм1', 2006), (2, 'Фильм2', 2006), (3, 'Фильм3', 2005);
- create table h (
- id int,
- hdsc char(15),
- constraint hpk_id primary key (id)
- ) default character set = cp1251;
- insert into h values (1, 'Имя_Героя_1'), (2, 'Имя_Героя_2'), (3, 'Имя_Героя_3');
- select * from f;
- select * from h;
- create table fh (
- f_id int,
- h_id int,
- constraint foreign key (f_id) references f(id),
- constraint foreign key (h_id) references h(id)
- ) default character set = cp1251;
- insert into fh values (1, 3), (2, 1), (3, 2);
- select * from f, h, fh
- where f_id = f.id and h_id = h.id and h.hdsc = 'Имя_Героя_3';
- select f.fdsc, h.hdsc from fh
- join f on fh.f_id = f.id
- join h on fh.h_id = h.id
- where h.hdsc = 'Имя_Героя_3';
Объяснение кода листинга программы
- Создание таблицы
f
с полямиid
,fdsc
,g
. - Вставка данных в таблицу
f
. - Создание таблицы
h
с полямиid
,hdsc
. - Вставка данных в таблицу
h
. - Выборка всех данных из таблицы
f
иh
. - Создание таблицы
fh
с полямиf_id
,h_id
, constraints внешнего ключа. - Вставка данных в таблицу
fh
. - Выборка всех данных из таблиц
f
,h
,fh
, гдеf_id
равенid
в таблицеf
иh_id
равенid
в таблицеh
, иh.hdsc
равно 'Имя_Героя_3'. - Выборка полей
fdsc
иhdsc
из таблицыfh
, используя операторы JOIN для соединения таблицf
иh
. - Ограничение выбора данных, где
h.hdsc
равно 'Имя_Героя_3'.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д