[英]Sql query about pair-remove duplicates
因此,我必须做一个询问,要求我找出每对电影的导演都导演过的导演人数。 我以为我应该选择两个流派ID实例和两个导演ID实例,并找到g_id不同但dir_id相同的那些,所以我尝试了类似的方法
select distinct g1.genre_id as genre1,
g2.genre_id as genre2,
count(distinct mhd1.director_id) as directors_count
from genre g1, genre g2, movie_has_genre mhg1,movie_has_genre
mhg2,movie_has_director mhd1,movie_has_director mhd2
where
(g2.genre_id <> g1.genre_id) and (mhg1.genre_id = g1.genre_id)
and (mhg2.genre_id = g2.genre_id) and (mhd1.movie_id = mhg1.movie_id)
and (mhd2.movie_id = mhg2.movie_id) and (mhd1.director_id =mhd2.director_id)
group by g1.genre_id, g2.genre_id;
基地是
actor(actor_id,first_name,last_name,gender)
director(director_id,first_name,last_name)
role(movie_id,actor_id,role)
genre(genre_id,name)
movie(movie_id,title,year,rank)
movie_has_director(movie_id,director_id)
movie_has_genre(genre_id,movie_id)
但它不起作用。 我在那里想念什么? 谢谢
编辑问题似乎是我同时获得(a,b)和(b,a)对,而我应该只获得(a,b)与
首先,您需要某种交叉连接才能获得两种流派的所有组合: genre g1 join genre g2 on g2.id > g1.id
。 然后,您需要将movie_has_genre
和movie_has_director
都加入( g1
和g2
),并且仅保留导演相同的行( md2.director_id = md1.director_id
)。 其余的是基本的GROUP BY
和COUNT
:
select g1.name as genre1,
g2.name as genre2,
count(distinct md1.director_id) as directors_count
from genre g1
join genre g2 on g2.id > g1.id
join movie_has_genre mg1 on mg1.genre_id = g1.id
join movie_has_genre mg2 on mg2.genre_id = g2.id
join movie_has_director md1 on md1.movie_id = mg1.movie_id
join movie_has_director md2 on md2.movie_id = mg2.movie_id
and md2.director_id = md1.director_id
group by g1.id, g2.id
加上@Paul的答案,您可以使用DISTINCT, LEAST, GREATEST
来消除重复的(a,b),(b,a)
select DISTINCT LEAST(g1.name,g2.name) as genre1,
GREATEST(g1.name,g2.name) as genre2,
count(distinct md1.director_id) as directors_count
from genre g1
join genre g2 on g2.id <> g1.id
join movie_has_genre mg1 on mg1.genre_id = g1.id
join movie_has_genre mg2 on mg2.genre_id = g2.id
join movie_has_director md1 on md1.movie_id = mg1.movie_id
join movie_has_director md2 on md2.movie_id = mg2.movie_id
and md2.director_id = md1.director_id
group by g1.id, g2.id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.