mysql - 从 tbl1.x = tbl2.x = tbl3.x 的多个表中选择/加入

标签 mysql sql database relational-database

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

我在 movies->producer、movies->directors 和 movies->writer 之间有多对多关系,称为 movie_director、movie_producer 和 movie_writer。这些表有一个指向名为 persons 的表的外键和一个指向 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;

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

最佳答案

首先,您需要将 movies 表与所有其他三个表连接起来,以查找任何电影的 producer、director 和 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

关于mysql - 从 tbl1.x = tbl2.x = tbl3.x 的多个表中选择/加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31772064/

相关文章:

java - 需要一个分布式键值查找系统

c# - 有没有办法用某个表中的列名填充组合框?

mysql - 按日期对时间戳字段进行分组

c++ - 用于在 C++ 中抽象数据库访问的开源库?

python - 当天第一次尝试查询失败,第二次尝试成功

sql - @@IDENTITY 在 INSERT 语句之后总是返回 0

mysql - 订购记录,例如拖放,看起来怎么样?

mysql - 错误 2003 (HY000) : Can't connect to MySQL server on '127.0.0.1' (111)

php - 使用php在数据库中插入日期格式

mysql - ActiveJDBC 忽略 DATETIME 列中的时间