SQL чаще всего встречается - PullRequest
0 голосов
/ 11 января 2019

Я хочу выяснить, какие актеры чаще всего играют в комедийных фильмах. Большинство их фильмографии должны быть комедийными.

Так, когда у актера есть 7 фильмов, и 4 из них - комедия.

(А также все актеры, которые только играли комедии.)

Стол "Актер":

|id_actor| name |
|--------|------|
|  12    |franco|
|  13    |rogen |
|  14    |hill  |
|  15    |teller|
|  16    |john  |

Таблица "жанр"

|id_genre|    name    |
|--------|------------|
|  22    |comedy      |
|  23    |thriller    |
|  24    |documentary |

Таблица «plays_in»:

|id_actor|    id_film |
|--------|------------|
|  12    |      5001  |
|  12    |      5002  |
|  12    |      5003  |
|  13    |      5004  |
|  13    |      5005  |
|  13    |      5006  |
|  14    |      5007  |
|  14    |      5008  |

Таблица is_in_genre

|id_genre|    id_film |
|--------|------------|
|  22    |      5001  |
|  22    |      5002  |
|  22    |      5003  |
|  23    |      5004  |
|  23    |      5005  |
|  24    |      5006  |
|  24    |      5007  |
|  24    |      5008  |

Это то, что у меня есть, но это не показывает актеров, которые играют только комедии.

select      id_actor, name 
from        actor x where
(
    select      count(id_film) 
    from        actor y
    natural join plays_in 
    natural join movie
    natural join is_in_genre
    where       id_genre = 4001 and x.id_actor = y.id_actor 
    group by    id_actor
)
<=
(
    select      count(id_film) 
    from        actor y
    natural join plays_in 
    natural join movie
    natural join is_in_genre
    where       id_genre != 4001 and x.id_actor = y.id_actor 
    group by    id_actor
)

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Фильм - это комедия, когда один из его жанров - комедия. Актеры, которых вы ищете, это те, чьи фильмы в основном комедии.

with comedies as
(
  select id_film
  from is_in_genre
  group by id_film
  having count(case when id_genre = (select id_genre from genre where name = 'comedy') then 1 end) > 0
)
, comedy_actors as 
(
  select id_actor
  from plays_in
  group by id_actor
  having avg(case when id_film in (select id_film from comedies) then 1 else 0 end) > 0.5
)
select *
from actor
where id_actor in (select id_actor from comedy_actors);
0 голосов
/ 11 января 2019

Соедините все 4 таблицы и сгруппируйте по актеру.
Чтобы получить только актеров, которые сыграли только более 50% комедий, необходимо выполнить следующие условия после группировки:
having (1.0 * sum(case when genrename = 'comedy' then 1 else 0 end ) / count(genrename)) > 0.5.

select 
  t.actorname
from (
select 
  actor.name actorname, genre.name genrename
from actor 
inner join plays_in
on plays_in.id_actor = actor.id_actor
inner join is_in_genre
on is_in_genre.id_film = plays_in.id_film
inner join genre
on genre.id_genre = is_in_genre.id_genre
) t
group by t.actorname
having (1.0 * sum(case when genrename = 'comedy' then 1 else 0 end ) / count(genrename)) > 0.5

См. Демоверсию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...