如何解决PostgreSQL 条件连接和结果过滤
我想要什么
出演过多个相同角色的演员的名字 导演的电影(但不是他们自己导演的)并且自己导演了至少一部电影。
select * from moviesdirectors LIMIT 5
前 5 名电影导演行
movieid director
6 Bob Persichetti
6 Peter Ramsey
6 Rodney Rothman
16 Sergio Leone
20 Spike Jonze
和
select * from moviescast LIMIT 5
电影播放前 5 行
movieid castname
427 Quei Tann
2878 Indrans
3272 Togo Igawa
517 Ajay Naidu
1608 Megan Sousa
我的尝试:
select * from moviescast LEFT JOIN moviesdirectors ON moviesdirectors.movieid=moviescast.movieid
where castname in (select director from moviesdirectors) AND castname!=director
ORDER BY castname
解决方法
如果我正确理解了你的问题,你想算上演员:
- 执导一部或多部电影
- 为同一位导演出演了不止一部电影,但该电影不应该让他们担任联合导演。
如果是这样的话,我用
复制了一个与你相似的数据集create table moviesdirectors( movieid int,director varchar);
create table moviescast( movieid int,castname varchar);
insert into moviesdirectors values(6,'Bob Persichetti');
insert into moviesdirectors values(6,'Peter Ramsey');
insert into moviesdirectors values(6,'Rodney Rothman');
insert into moviesdirectors values(10,'Sergio Leone');
insert into moviesdirectors values(10,'Spike Jonze');
insert into moviesdirectors values(20,'Spike Jonze');
insert into moviescast values(6,'Bob Persichetti');
insert into moviescast values(20,'Bob Persichetti');
insert into moviescast values(10,'Bob Persichetti');
insert into moviescast values(6,'Quei Tann');
insert into moviescast values(20,'Quei Tann');
insert into moviescast values(10,'Quei Tann');
insert into moviescast values(6,'Sergio Leone');
insert into moviescast values(20,'Sergio Leone');
insert into moviescast values(6,'Peter Ramsey');
insert into moviescast values(20,'Peter Ramsey');
表 moviesdirectors
现在包含以下内容
movieid | director
---------+-----------------
6 | Bob Persichetti
6 | Peter Ramsey
6 | Rodney Rothman
10 | Sergio Leone
10 | Spike Jonze
20 | Spike Jonze
(6 rows)
和表 moviescast
以下
movieid | castname
---------+-----------------
6 | Bob Persichetti
20 | Bob Persichetti
10 | Bob Persichetti
6 | Quei Tann
20 | Quei Tann
10 | Quei Tann
6 | Sergio Leone
20 | Sergio Leone
6 | Peter Ramsey
20 | Peter Ramsey
(10 rows)
在上述数据集中,只有为 Bob Persichetti
工作的 Spike Jonze
应满足最初陈述的 2 个条件。
其余的都不应该,因为:
-
Quei Tann
从未导演过 -
Sergio Leone
曾出演两部电影,但导演不同 -
Peter Ramsey
出演了两部电影,但只有一部(movieid=6
也是他自己导演的)
为了提供解决方案,我将问题分为以下查询的各个步骤:
-
directed_by_themselves
:检索movieid
的列表,其中director
也是演员表的一部分 -
directors
:检索不同的董事列表 - 最后一个查询将所有内容粘合在一起,并从结果数据集中删除所有演员同时也是导演的电影
with directed_by_themselves as (
select distinct moviesdirectors.movieid,moviesdirectors.director
from moviesdirectors join moviescast
on moviesdirectors.movieid = moviescast.movieid
and moviesdirectors.director = moviescast.castname
),directors as (
select distinct director from moviesdirectors)
select d.director,c.castname,count(*) nr_movies
from moviesdirectors d join moviescast c
on (d.movieid = c.movieid)
join directors dir on c.castname = dir.director
where (d.movieid,c.castname) not in (select movieid,director from directed_by_themselves)
group by d.director,c.castname
having count(*) > 1;
结果是
director | castname | nr_movies
-------------+-----------------+-----------
Spike Jonze | Bob Persichetti | 2
(1 row)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。