Sql запрос о парном удалении дубликатов - PullRequest
0 голосов
/ 10 мая 2018

Так что мне нужно сделать запрос, в котором меня просят найти количество режиссеров, которые для каждой пары жанров фильмов руководили обоими.Я подумал, что должен взять два экземпляра идентификатора жанра и два экземпляра идентификатора директора и найти те, где 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) с

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Добавив к ответу @ Paul, вы можете избавиться от дубликатов (a, b), (b, a), используя DISTINCT, LEAST, GREATEST

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
0 голосов
/ 10 мая 2018

Для начала вам нужно перекрестное соединение, чтобы получить все комбинации двух жанров: 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
...