首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从多个表中选择/连接,其中tbl1.x = tbl2.x = tbl3.x

从多个表中选择/连接,其中tbl1.x = tbl2.x = tbl3.x
EN

Stack Overflow用户
提问于 2015-08-02 12:51:28
回答 2查看 71关注 0票数 1

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

我在电影->制片人,电影->导演和电影->作家movie_director,movie_producer和movie_writer之间有很多很多关系。这些表具有一个名为persons的表的外键和一个用于电影表的外键。

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

代码语言:javascript
复制
SELECT movie_director.name
from movie_director, 
     movie_producer, 
     movie_writer
where movie_producer.name = movie_director.name = movie_writer.name;

创建movie_director:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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;

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-02 12:59:23

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

请注意,不要使用旧样式的逗号分隔联接,始终使用正确的Inner Join语法连接两个或多个表。

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2015-08-02 14:06:43

你可以试试group_concat。参考文档group-concat

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31772064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档