SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 21.03.2011 20:47:20

pagal
Участник
Зарегистрирован: 21.03.2011
Сообщений: 16

Выборка определенных столбцов из нескольких таблиц

Помогите пожалуйста, у меня есть 2 таблицы:


1. Таблица Films:


|    id   |     Title_en       |         Title_ru        |   Year   |   description   |   cover   |
---------------------------------------------------------------------------------
|    1   | Main Hoon Na    |   Я рядом с тобой  |  2004   |  ................   | ........... |
|    2   |        Don          |            Дон          |  2006   |  ................   | ........... |



Где:
Title_en - название на английском
Title_ru - название на русском
Year - год   


2. Таблица Actors:


|    id   |     Name_en     |         Name_ru       |   Year   |   description   |   cover   |
---------------------------------------------------------------------------------
|    1   | Shahrukh Khan  |    Шахрукх кхан     |  1965   |  ................   | ........... |
|    2   |   Hritik Roshan   |      Ритик Рошан    |  1974   |  ................   | ........... |



В результате мне надо получить, что-то такого типа :


|     Title_en       |         Title_ru        |   Year   |     Name_en     |         Name_ru       |
-------------------------------------------------------------------------------------
| Main Hoon Na    |   Я рядом с тобой  |  2004   | Shahrukh Khan |    Шахрукх кхан     |
|        Don          |            Дон          |  2006   |   Hritik Roshan  |      Ритик Рошан    |


Возможно ли так, и как такое сделать, подскажите пожалуйста.

Неактивен

 

#2 21.03.2011 22:55:22

VBKesha
Участник
Зарегистрирован: 21.03.2011
Сообщений: 2

Re: Выборка определенных столбцов из нескольких таблиц

При условии что Actors.id уазкывает на Films.id фильма в котором участвовал актёр.


select Films.Title_en, Films.Title_ru, Films.Year, Actors.Name_en, Actors.Name_ru from Films,Actors where Films.id=Actors.id
 


Хотя такая схема полей ИМХО не очень будет удобна. Так как и фильмы и актёры дожны иметь связи моного ко многим, желательна дополнительная таблица вида id,film_id, actors_id

Неактивен

 

#3 22.03.2011 13:47:07

pagal
Участник
Зарегистрирован: 21.03.2011
Сообщений: 16

Re: Выборка определенных столбцов из нескольких таблиц

Если вы имели ввиду дополнительную таблицу, вида:


|    id   |   film_id  |  actors_id  |
-------------------------------
|    1   |      1      |       1        |
|    2   |      2      |       1        |
|    3   |      2      |       2        |


То как ее связать с таблицей Films и Actors, подскажите пожалуйста.

Неактивен

 

#4 22.03.2011 15:42:50

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Выборка определенных столбцов из нескольких таблиц

Эта таблица и является связкой между таблицей фильмов и актёров. К слову, поле id в ней ИМХО не особо-то и нужно.
Если назвать её, допустим, Relations, то запрос, который сделает то, что Вы хотите будет выглядеть примерно так:

select f.Title_en as f_title_en, a.Name_en as a_name_en from Films f, Actors a where f.id in (select film_id from relations where actors_id=a.id) order by f_title_en,a_name_en;


Тестировал запрос на своих таблицах/данных, привожу их ниже

use test;

drop table if exists `films`;
CREATE TABLE if not exists `films` (
  `id` bigint(20) unsigned NOT NULL auto_increment,
  `title_en` char(255) default NULL,
  `title_ru` char(255) default NULL,
  `year` int unsigned  default 0,
  PRIMARY KEY  USING BTREE (`id`)
) ENGINE=MyISAM;
insert into `films` values(NULL,'Uboynaya sila','Убойная Сила',2000),(NULL,'Nochnoy dozor','Ночной дозор',2004),(NULL,'Stilyagi','Стиляги',2008);

drop table if exists `actors`;
CREATE TABLE if not exists `actors` (
  `id` bigint(20) unsigned NOT NULL auto_increment,
  `name_en` char(255) default NULL,
  `name_ru` char(255) default NULL,
  `year` int unsigned  default 0,
  PRIMARY KEY  USING BTREE (`id`)
) ENGINE=MyISAM;
insert into `actors` values(NULL,'Konstantin Habenskiy','Константин Хабенский',1972),(NULL,'Oksana Akinshina','Оксана Акиньшина',1987),(NULL,'Alexey Maklakov','Алексей Маклаков',1962);

drop table if exists `relations`;
CREATE TABLE if not exists `relations` (
  `film_id` bigint(20) unsigned,
  `actor_id` bigint(20) unsigned
) ENGINE=MyISAM;
insert into `relations` values(1,1),(2,1),(3,2),(2,3);
 

Запрос, похожий на то, что писал топикстартер вот: (добавьте недостающие поля)

select f.title_en as f_title_en, a.name_en as a_name_en from films f, actors a where f.id in (select film_id from relations where actor_id=a.id) order by f_title_en,a_name_en;
 


Результат:

+---------------+----------------------+
| f_title_en    | a_name_en            |
+---------------+----------------------+
| Nochnoy dozor | Alexey Maklakov      |
| Nochnoy dozor | Konstantin Habenskiy |
| Stilyagi      | Oksana Akinshina     |
| Uboynaya sila | Konstantin Habenskiy |
+---------------+----------------------+
4 rows in set (0.00 sec)

Отредактированно deadka (22.03.2011 15:45:42)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 22.03.2011 16:58:43

pagal
Участник
Зарегистрирован: 21.03.2011
Сообщений: 16

Re: Выборка определенных столбцов из нескольких таблиц

Спасибо большое)

Неактивен

 

#6 22.03.2011 17:39:55

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Выборка определенных столбцов из нескольких таблиц

Я бы только еще индексы на таблицу многие-ко многим добавил стандартные:
PRIMARY KEY(film_id, actor_id) и INDEX(actor_id).

Неактивен

 

#7 22.03.2011 21:09:09

pagal
Участник
Зарегистрирован: 21.03.2011
Сообщений: 16

Re: Выборка определенных столбцов из нескольких таблиц

Я не совсем понимаю почему INDEХ к actor_id, объясните пожалуйста.

Неактивен

 

#8 23.03.2011 00:51:09

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Выборка определенных столбцов из нескольких таблиц

Ну, когда Вы начнете выбирать фильмы, в которых играет Хабенский,
этот индекс Вам понадобится smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson