2015-10-12 1 views
0

У меня есть две базы данных, которые ведут к этому: таблица act_gigs с колонками actor_name и movie_title и столовые фильмы с колонками movie_title и release_year. Я хотел бы сделать SQL-запрос, в котором перечислены имена всех участников, участвовавших в каждом отдельном фильме в данном выпуске_year, и отображаться два столбца: имена актеров (actor_names) и год, в котором они участвовали в каждом фильме (RELEASE_YEAR).Как перечислить актеров кино, которые выступали в каждом фильме, выпущенном в любом конкретном году

Например:

  movie_title   | release_year 
    ------------------------------------------ 
    'The Green Mile'   | 2000 
    'Titanic'     | 1997 
    'Cast Aways'    | 2000 
    'Independence Day'   | 1997 

      actor_name   | movie_title 
    ------------------------------------------------- 
    'Leonardo DiCaprio'  | 'Titanic' 
    'Tom Hanks'    | 'The Green Mile' 
    'Will Smith'    | 'Independence Day' 
    'Tom Hanks'    | 'Cast Aways' 

Это означает, что таблица, я хотел бы вернуться является

 actor_name | release_year 
    --------------------------- 
    'Tom Hanks' | 2000 

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

+1

Это был задан несколько раз. Возможный дубликат участников [sql list, которые выступали в фильме до 1900 года, а также в фильме после 2000 года) (http://stackoverflow.com/questions/29617880/sql-list-actors-who-acted-in-a-film -before-1900-and-in-a-film-after-2000) – ragerory

+1

Вы отметили это в MySQL, SQL, PostgreSQL ... Какой из них вам нужен? – Armin

+0

О, мой плохой. Я хотел бы это в Postgre – Jeffrey

ответ

0

Вот один из способов:

SELECT y.actor_name, y.release_year 
FROM (SELECT release_year, COUNT(*) AS cnt 
     FROM movies 
     GROUP BY release_year) AS x 
INNER JOIN (SELECT actor_name, release_year, COUNT(*) AS cnt 
      FROM acting_gigs AS t1 
      INNER JOIN movies AS t2 ON t1.movie_title = t2.movie_title 
      GROUP BY actor_name, release_year) AS y 
ON x.release_year = y.release_year AND x.cnt = y.cnt 

Производная таблица x содержит количество фильмов в год, в то время как производная таблица y содержит количество фильмов в год/за актера.

В JOIN предикаты:

  • x.release_year = y.release_year и
  • x.cnt = y.cnt

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

Demo here

Вот еще, вероятно, более эффективный, способ с использованием оконных функций:

SELECT DISTINCT actor_name, release_year 
FROM (
SELECT actor_name, release_year, 
     COUNT(*) OVER (PARTITION BY actor_name, release_year) AS cntPerActorYear, 
     COUNT(*) OVER (PARTITION BY release_year) AS cntPerYear 
FROM acting_gigs AS t1 
INNER JOIN movies AS t2 ON t1.movie_title = t2.movie_title) AS t 
WHERE cntPerActorYear = cntPerYear 

Demo here

+0

Именно то, что я искал. Спасибо. – Jeffrey

0

Это должно сделать трюк:

select m.release_year 
    , a.actor_name 
    , count(1) total_movies 
from movies m 
    join actors a on a.movie_title = m.movie_title 
group by m.release_year, a.actor_name 
order by m.release_year, a.actor_name -- or however you want to order it 
Смежные вопросы