繁体   English   中英

有关删除配对的SQL查询

[英]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_genremovie_has_director都加入( g1g2 ),并且仅保留导演相同的行( md2.director_id = md1.director_id )。 其余的是基本的GROUP BYCOUNT

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM