繁体   English   中英

从多个表中选择/加入,其中tbl1.x = tbl2.x = tbl3.x

[英]Select/Join from multiple tables where tbl1.x = tbl2.x = tbl3.x

我有一个电影数据库,需要执行查询以返回由同一人撰写,导演和制作的所有电影。

我在电影->制片人,电影->导演和电影->作家之间有很多联系,它们被称为movie_director,movie_producer和movie_writer。 这些表具有称为人员的表的外键和具有电影表的外键。

如何选择具有同一个制片人,导演和编剧的电影? 我已经试过这个select语句,但是它返回很多重复项:

SELECT movie_director.name
from movie_director, 
     movie_producer, 
     movie_writer
where movie_producer.name = movie_director.name = movie_writer.name;

创建movie_director:

CREATE TABLE `movie_director` (
  `title` VARCHAR(100) NOT NULL,
  `year` int NOT NULL,
  `name` VARCHAR(100) NOT NULL,
  PRIMARY KEY (`title`, `year`, `name`),
  INDEX `fk_movies_has_directors_name_idx` (`name` ASC),
  INDEX `fk_movies_has_directors_titleyear_idx` (`title` ASC, `year` ASC),
  CONSTRAINT `fk_movies_has_directors_titleyear`
    FOREIGN KEY (`title` , `year`)
    REFERENCES `mdb`.`movies` (`title` , `year`)
    ON DELETE cascade
    ON UPDATE cascade,
  CONSTRAINT `fk_movies_has_directors_name`
    FOREIGN KEY (`name`)
    REFERENCES `mdb`.`directors` (`name`)
    ON DELETE cascade
    ON UPDATE cascade)
    ENGINE INNODB;

创建movie_director:

CREATE TABLE `movie_producer` (
 `title` VARCHAR(100) NOT NULL,
  `year` int NOT NULL,
  `name` VARCHAR(100) NOT NULL,
  PRIMARY KEY (`title`, `year`, `name`),
  INDEX `fk_movies_has_producers_name_idx` (`name` ASC),
  INDEX `fk_movies_has_producers_titleyear_idx` (`title` ASC, `year` ASC),
  CONSTRAINT `fk_movies_has_producers_titleyear`
    FOREIGN KEY (`title` , `year`)
    REFERENCES `mdb`.`movies` (`title` , `year`)
    ON DELETE cascade
    ON UPDATE cascade,
  CONSTRAINT `fk_movies_has_producers_name`
    FOREIGN KEY (`name`)
    REFERENCES `mdb`.`producers` (`name`)
    ON DELETE cascade
    ON UPDATE cascade)
    ENGINE INNODB;

创建movie_writer:

CREATE TABLE `movie_writer` (
 `title` VARCHAR(100) NOT NULL,
  `year` int NOT NULL,
  `name` VARCHAR(100) NOT NULL,
  PRIMARY KEY (`title`, `year`, `name`),
  INDEX `fk_movies_has_writers_name_idx` (`name` ASC),
  INDEX `fk_movies_has_writers_titleyear_idx` (`title` ASC, `year` ASC),
  CONSTRAINT `fk_movies_has_writers_titleyear`
    FOREIGN KEY (`title` , `year`)
    REFERENCES `mdb`.`movies` (`title` , `year`)
    ON DELETE cascade
    ON UPDATE cascade,
  CONSTRAINT `fk_movies_has_writers_name`
    FOREIGN KEY (`name`)
    REFERENCES `mdb`.`writers` (`name`)
    ON DELETE cascade
    ON UPDATE cascade)
    ENGINE INNODB;

感谢所有帮助或有用信息的链接!

首先,您需要将movies表与所有其他三个表连接起来,以查找任何电影的producer ,director and writer的名称,然后可以在所有字段中名称相同的地方过滤结果。

另外请注意,请勿使用旧式逗号分隔的连接,请始终使用正确的Inner Join语法来连接两个或多个表

SELECT     movie_director.NAME 
FROM       movies m 
INNER JOIN movie_director md 
ON         m.movieid = md.movieid 
INNER JOIN movie_producer mp 
ON         m.movieid = mp.movieid movie_writer mw 
ON         m.movieid = mp.movieid 
WHERE      mp.NAME=md.NAME 
AND        mp.NAME=mw.NAME

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM