【问题标题】:Select/Join from multiple tables where tbl1.x = tbl2.x = tbl3.x从 tbl1.x = tbl2.x = tbl3.x 的多个表中选择/加入
【发布时间】:2015-08-02 12:51:28
【问题描述】:

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

我在电影->制片人、电影->导演和电影->作家之间有多对多的关系,称为movie_director、movie_producer和movie_writer。这些表有一个外键指向名为 people 的表和一个指向 movies 表的外键。

如何选择一个且制片人、导演和编剧相同的电影?我已经尝试过这个 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;

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

【问题讨论】:

  • 选择distinct ...
  • 也使用显式连接
  • 这 3 个表格中的电影是如何识别的?
  • 电影表使用标题和年份标识。这 3 个表格引用了电影的标题和年份。
  • 只需发布带有show create table xxxx 的架构即可。不要手写或描述它。提出一个质量问题

标签: mysql sql database relational-database


【解决方案1】:

首先,您需要将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

【讨论】:

  • 或者直接说join。我们确实需要查看架构,因为您在这里做了很多假设!
  • @reaanb - 看起来 mysql 支持 a=b=c 语法,这就是我删除的原因
  • 修改了一下,因为我不使用movieID,而是使用标题和年份。但这个查询似乎有效:SELECT md.name as Director, mp.name as Producer, mw.name as Writer, m.title, m.year FROM movies m INNER JOIN movie_director md ON m.title = md.title AND m.year = md.year INNER JOIN movie_producer mp ON m.title = mp.title AND m.year = mp.year INNER JOIN movie_writer mw ON m.title = mw.title AND m.year = mw.year WHERE mp.name=md.name AND mp.name=mw.name;
  • @vff - 很高兴它有帮助
【解决方案2】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 2023-03-30
    相关资源
    最近更新 更多