Select/Join 来自多个表,其中 tbl1.x = tbl2.x = tbl3.x

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

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

我在电影->制片人、电影->导演和电影->编剧之间有多对多关系,称为 movie_director、movie_producer 和 movie_writer。这些 table 有一个 table 被叫人的外键和一个电影 table.

的外键

我怎样才能select部有一部且制作人、导演和编剧相同的电影?我试过这个 select 语句,但它 returns 有很多重复项:

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 table 和所有其他三个 table 来找到任何电影的 producer ,director and writer 的名字和 然后您可以过滤所有字段名称相同的结果。

作为旁注,切勿使用旧式逗号分隔连接始终使用正确的 Inner Join 语法连接两个或多个 tables

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

你可以试试group_concat。参考文档 http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat