【问题标题】:How to list movie actors who acted in every single film released in any given year如何列出在任何一年发行的每部电影中出演的电影演员
【发布时间】:2015-10-13 04:34:26
【问题描述】:

我有两个数据库指向这个:一个表 actuator_name 和 movie_title 以及表 movies 和列 movie_title 和 release_year。我想做一个 SQL 查询,列出在给定的 release_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

我一直在尝试使用子查询和外部连接,但我还没有完全找到解决方案。我知道我必须使用计数,但我不确定如何以这样的方式多次应用它。

【问题讨论】:

标签: sql postgresql


【解决方案1】:

这是一种方法:

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

【讨论】:

  • 正是我想要的。谢谢。
【解决方案2】:

这应该可以解决问题:

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

【讨论】:

    【解决方案3】:

    这是你在 MS SQL 中的操作方法 - http://sqlfiddle.com/#!6/492ac/3

    SELECT
      A.ActorName,
      M.ReleaseYear
    FROM
      Movies AS M
    INNER JOIN
      ActorsMovies AS A
    ON
      M.MovieTitle = A.MovieTitle
    

    【讨论】:

      猜你喜欢
      • 2015-06-19
      • 2020-08-03
      • 2015-06-24
      • 1970-01-01
      • 2015-06-25
      • 2017-04-18
      • 2020-08-06
      • 1970-01-01
      • 2017-07-04
      相关资源
      最近更新 更多