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
我有一个电影数据库,需要执行查询 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