0

我正在尝试在 MySQL 中创建一个视图以包含 3 个不同的表。

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) 
);

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。另一件事要注意的是,一部电影中有 3 名演员中的 2 名,所以我应该至少有 9 部电影显示不是 192。我不知道我做错了什么。我就是想不通。我在想也许是一种join或某种。

4

2 回答 2

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

就像我提到的那样,您缺少一张可以容纳多个演员并将他们与一部电影相关联的表格:一对多关系。

于 2015-05-07T03:42:05.340 回答
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

请注意,我对 ID 字段使用 INT 而不是 DECIMAL,对 CHAR 字段使用 VARCHAR 而不是。这可能有助于为大多数通用用途分配正确的空间。

于 2015-05-07T03:48:51.217 回答