2015-05-07 3 views
0

Я пытаюсь создать представление в MySQL для включения из трех разных таблиц.Создать вид из трех разных таблиц?

CREATE TABLE ACTOR (
    ACTOR_ID DECIMAL (2,0) PRIMARY KEY NOT NULL, 
    ACTOR_FIRST CHAR(25), 
    ACTOR_LAST CHAR(30), 
    DOB   DATE 
); 

CREATE TABLE DIRECTOR (
    DIRECTOR_ID  DECIMAL(2,0) PRIMARY KEY NOT NULL, 
    DIRECTOR_FIRST CHAR(25), 
    DIRECTOR_LAST CHAR(30) 
); 

CREATE TABLE FILM (
    FILM_ID   DECIMAL(2,0) PRIMARY KEY NOT NULL, 
    TITLE   CHAR(50), 
    RELEASE_DATE DATE, 
    DIRECTOR_ID  DECIMAL(2,0), 
    GENRE_ID  CHAR(10), 
    PRODUCTION_ID CHAR(3) 
); 

The VIEW Я пытаюсь создать:

create view film_production as 
select 
    title, 
    actor_first, 
    actor_last, 
    director_first, 
    director_last, 
    Production_id, 
    release_date 
from film, 
     actor, 
     director 
; 

Это дает мне как 192 результатов. Но у меня только 3 актера, с 8 фильмами с 8 режиссерами и 6 production_id. Еще одно замечание: в 1 фильме есть 2 из 3 актеров, поэтому у меня должно быть как минимум 9 фильмов, которые показывают не 192. Я не знаю, что я делаю неправильно. Я просто не могу понять это. Я думаю, может быть, join или какой-то.

+0

Куда вы можете присоединиться к таблицам? например Таблица, в которой есть актер <-> Фильм и режиссер <-> Отношение фильма? Без них вы выполняете полное внешнее соединение и получаете продукт из всех таблиц (# players * # director * # films) – Dijkgraaf

ответ

1

Вы задумывались над добавлением ссылочных ключей между актером и фильмом, а также режиссером и фильмами?

Актер

CREATE TABLE ACTOR (
    ID  INT PRIMARY KEY NOT NULL, 
    FIRSTNAME VARCHAR(25), 
    LASTNAME VARCHAR(30), 
    DOB  DATE 
); 

директор

CREATE TABLE DIRECTOR (
    ID   INT PRIMARY KEY NOT NULL, 
    FIRSTNAME VARCHAR(25), 
    LASTNAME VARCHAR(30) 
); 

Фильм со связями с актером и режиссером

CREATE TABLE FILM (
    FILM_ID   INT PRIMARY KEY NOT NULL, 
    TITLE   VARCHAR(50), 
    RELEASE_DATE DATE, 
    DIRECTOR_ID  INT, 
    GENRE_ID  INT, 
    PRODUCTION_ID INT, 
    ACTOR_ID  INT, 
    CONSTRAINT FK_FILM_DIRECTOR_ID FOREIGN KEY (DIRECTOR_ID) 
    REFERENCES DIRECTOR(ID), 
    CONSTRAINT FK_FILM_ACTOR_ID FOREIGN KEY (ACTOR_ID) 
    REFERENCES ACTOR(ID) 
); 

Посмотреть комбинируя 3 таблицы

create view film_production as 
select 
    title, 
    a.firstname as actor_firstname, 
    a.lastname as actor_lastname, 
    d.firstname as director_firstname, 
    d.lastname as directory_lastname, 
    Production_id, 
    release_date 
from  film f 
left join actor a on f.actor_id = a.id 
left join director d on f.director_id = d.id; 

Пример: http://sqlfiddle.com/#!9/9fe1e

Обратите внимание, что я использовал INT вместо десятичного ID полей и VARCHAR вместо CHAR полей. Это может помочь в распределении правильного пространства для большинства применений общего назначения.

+0

О, хорошо, что я использовал ваш, и мне пришлось вносить изменения в поля INT для P.ID и G.ID, поскольку эти два поля на самом деле используют буквы и некоторые специальные символы, и я помещал остальные таблицы в свою базу данных в качестве теста. оно работает. только одна проблема заключается в том, что с вашей настройкой и изменениями, которые я сделал с ней. Он не показывает второй фильм, который играет другой актер. Но пока это работает, поэтому я собираюсь изменить мою базу данных и изменить вашу настройку в соответствии с моими потребностями. –

+0

как я могу превратить это в ответ? –

+0

Я не думаю, что это правильный ответ на проблему, поскольку в фильме есть более одного актера. С этой схемой вам нужно будет иметь несколько записей FILM для учета нескольких участников в движении. – Chizzle

2

Да, в вашем представлении должны использоваться соединения.

НО, похоже, что вам не хватает стола, что-то вроде film_actor. Используя недостающую таблицу, и если вы пытаетесь получить актер и режиссер каждого фильма было бы

SELECT 
    FILM.* 
,ACTOR_FIRST + ' ' + ACTOR_LAST AS actor 
,DIRECTOR_FIRST + ' ' + DIRECTOR_LAST AS director 
FROM FILM 
INNER JOIN FILM_ACTOR fa ON fa.FILM_ID = FILM.FILM_ID 
INNER JOIN ACTOR ON ACTOR.ACTOR_ID = FILM_ACTOR.ACTOR_ID 
INNER JOIN DIRECTOR d ON d.DIRECTOR_ID = FILM.DIRECTOR_ID 

Как я уже говорил, вам не хватает таблицу, которая будет держать несколько актеров и связать их один фильм: от одного до многих отношений.

+0

Ну, единственной другой таблицей, которая была бы полезной, была бы моя таблица actor_movies, которая имеет только FILM_ID, ACTOR_ID, TITLE , Возможно, я должен включить эту таблицу, вместо имен actor_id. –

+0

Да, это именно то, о чем я говорил :). – Chizzle

+0

Эта таблица должна ДЕЙСТВИТЕЛЬНО быть вызвана ACTOR_FILM, хотя для ясности (чтобы показать, что она связывает ваши две другие таблицы) – Chizzle

Смежные вопросы