SQL joint tables Сортировка

Рейтинг: 0Ответов: 2Опубликовано: 12.08.2023

Union or full joint movies and users

Determine which lead studio's movies are favorited by users the most. Подскажите как выбрать ведущую кино-компанию (lead_studio) по пользователям?

SELECT * FROM movies LEFT JOIN users on movie_id = favorite_movie_id
UNION
SELECT * FROM movies RIGHT JOIN users on movie_id = favorite_movie_id;

Моя логика:

select * from movies join users on movie_id = favorite_movie_id;

нужно сгруппировать lead_studio чтобы не было повторений и затем нужно отталкиваться от favorite_movie_id. То есть чье кино выбрал пользователь идет в копилку компании Но как это написать вообще не представляю

Ответы

▲ 1
Select m.lead_studio
from movies m
left join users u on m.movie_id = u.favorite_movie_id
group by m.lead_studio
order by count(u.favorite_movie_id) desc
▲ 0

Посмотрите пример

-- test data
create table movies (movie_id int,lead_studio varchar(20));
insert into movies values
 (1,'Fox')
,(2,'Disney')
,(3,'Paramount')
,(4,'Paramount')
,(5,'Warner bros.')
;
create table users (user_id int,favorite_movie_id int);
insert into users values
 (1001,2)
,(1002,3)
,(1003,4)
,(1005,2)
,(1006,5)
;
-- query
with favorites as( -- выбираем фильмы-фавориты и количество пользователей, их выбравших
select favorite_movie_id ,count(user_id) cnt
from users
group by favorite_movie_id
)
,favorite_counts as ( -- считаем сумму выбранного по каждой студии
select  lead_studio,coalesce(sum(cnt),0) cnt
  ,rank()over(order by sum(cnt) desc) rnk -- упорядочиваем по популярности
from movies m
left join favorites f on f.favorite_movie_id=m.movie_id
group by lead_studio
)
select lead_studio
from favorite_counts
where rnk=1  -- выбираем самые популярные студии

Можно применить INNER JOIN, если действительно нужны только самые популярные строки.

Промежуточный результат

lead_studio cnt rnk
Disney 2 1
Paramount 2 1
Warner bros. 1 3
Fox 0 4

Результат

lead_studio
Disney
Paramount

Fiddle пример