Список актеров, которых снимали в комедиях больше, чем в драмах и трагедиях, вместе взятых - PullRequest
0 голосов
/ 22 марта 2020

БАЗЫ ДАННЫХ

  • Mov ie (название, год, жанр, бюджет, брутто)
  • Режиссер (имя , страна, YofB)
  • Актер (название, страна, YofB)
  • Производитель (название, страна, YofB)
  • DirectorMov ie (d_name, m_title, m_year)
  • ActorMov ie (a_name, m_title, m_year)
  • ProducerMov ie (p_name, m_title, m_year)

Жанр атрибута в таблице Mov ie имеет значение один из

{“comedy”, drama”, tragedy”, “musical”, “horror”}

Запрос:

select 
    A_NAME
from 
    ACTORMOVIE,
    (select title, GENRE 
     from movie 
     where GENRE = 'Comedy') T, 
    (select title, GENRE 
     from movie 
     where GENRE = 'drama' or  GENRE = 'tragedy') S
where 
    M_TITLE = T.title and M_TITLE = S.title
group by 
    a_name  
having 
    count(T.GENRE) > count(S.GENRE)

1 Ответ

0 голосов
/ 22 марта 2020

Вы должны присоединиться к 3 таблицам: Actor, ActorMovie и Movie. Затем group by actor и задайте условие в предложении having:

select a.name
from Actor a
inner join ActorMovie am on am.a_name = a.name
inner join Movie m on m.title = am.m_title
group by a.name
having count(case when m.genre = 'comedy' then 1 end) >
       count(case when m.genre in ('drama', 'tragedy') then 1 end) 

Можно также записать условие Имеющий:

having sum(case when m.genre = 'comedy' then 1 else 0 end) >
       sum(case when m.genre in ('drama', 'tragedy') then 1 else 0 end) 

или в базах данных, таких как MySql и SQLite:

having sum(m.genre = 'comedy') >
       sum(m.genre in ('drama', 'tragedy')) 

Вы также можете использовать этот запрос:

select am.name
from ActorMovie am inner join Movie m 
on m.title = am.m_title
group by am.name
having count(case when m.genre = 'comedy' then 1 end) >
       count(case when m.genre in ('drama', 'tragedy') then 1 end) 

, в котором таблица Actor не участвует, поэтому вы объединяете только 2 таблицы, потому что имя актера находится в таблице ActorMovie.

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