0

次のデータベース構造を使用します。

movies_directors(director_id:int、movie_id:int)
roles(actor_id:int、movie_id:int、roles:string)

監督が最も多くの映画で協力している俳優を見つけるにはどうすればよいですか?

directors_id, actor_id

クエリを試した後に得られる結果は次のとおりです。

DIRECTOR_ID ACTOR_ID COLLABORATIONS


    101          1              2
    102          6              1
    105          4              1
    101          2              1
    104          8              1
    101          3              1
    103          7              1
    100         11              1
    101         10              1
    100          5              1
    104          2              1

DIRECTOR_ID ACTOR_ID COLLABORATIONS


    101          9              1

私はただすべての監督と最大の映画を一緒に持っている俳優の組み合わせが必要です。たとえば、director_id 101の場合、10112エントリのみを表示する必要があります。

4

3 に答える 3

2

おそらく、TDQD — テスト駆動クエリ設計を使用する必要があります。

Q1: どの監督がどの俳優と仕事をしたか

最初のステップは、映画でどの監督がどの俳優と仕事をしたかを確立することです。これは、Movie_ID 列の 2 つのテーブルを結合することによって検出されます。

SELECT d.Movie_ID, d.Director_ID, A.Actor_ID
  FROM Movies_Directors AS d
  JOIN Roles AS a
    ON d.Movie_ID = a.Movie_ID

テーブルの主キーについて教えてくれなかったので、1 人の俳優が 1 つの映画で複数の異なる役割を持っているとして記録できるかどうかはわかりません。Roles テーブルの主キーは組み合わせ (Movie_ID、Actor_ID) であると仮定します。

Q2: 各監督は各俳優と何回仕事をしましたか?

上記のクエリに基づいて、俳優と監督の各組み合わせの行数をカウントする必要があります。

SELECT d.Director_ID, A.Actor_ID, COUNT(*) AS num_joint_movies
  FROM Movies_Directors AS d
  JOIN Roles AS a
    ON d.Movie_ID = a.Movie_ID
 GROUP BY d.Director_ID, A.Actor_ID

Q3: 各監督が俳優と仕事をした最大回数は?

上記の結果から、各監督の共同映画の最大数を見つける必要があります。これは、次のように、上記のクエリをテーブルとして扱う必要があります。

SELECT n.Director_ID, MAX(n.num_joint_movies) AS max_joint_movies
  FROM (SELECT d.Director_ID, A.Actor_ID, COUNT(*) AS num_joint_movies
          FROM Movies_Directors AS d
          JOIN Roles AS a
            ON d.Movie_ID = a.Movie_ID
         GROUP BY d.Director_ID, A.Actor_ID
       ) AS n
 GROUP BY n.Director_ID

Q4: 各監督と最も仕事をした俳優は?

ここで、クエリ Q2 と Q3 を組み合わせてアクターも取得する必要があります。

SELECT q3.Director_ID, q2.Actor_ID
  FROM (SELECT n.Director_ID, MAX(n.Num_Joint_Movies) AS Max_Joint_Movies
          FROM (SELECT d.Director_ID, A.Actor_ID, COUNT(*) AS Num_Joint_Movies
                  FROM Movies_Directors AS d
                  JOIN Roles AS a
                    ON d.Movie_ID = a.Movie_ID
                 GROUP BY d.Director_ID, A.Actor_ID
               ) AS n
         GROUP BY n.Director_ID
       ) AS q3
  JOIN (SELECT d.Director_ID, A.Actor_ID, COUNT(*) AS Num_Joint_Movies
          FROM Movies_Directors AS d
          JOIN Roles AS a
            ON d.Movie_ID = a.Movie_ID
         GROUP BY d.Director_ID, A.Actor_ID
        ) AS q2
     ON q3.Director_ID = q2.Director_ID AND q3.Max_Joint_Movies = q2.Num_Joint_Movies

Q5: 共通テーブル式 (CTE) を使用する

SQL 標準では、WITH 句で導入された一般的なテーブル式を使用して、次のようなクエリを簡素化できます。

WITH cte AS
    (SELECT d.Director_ID, A.Actor_ID, COUNT(*) AS Num_Joint_Movies
       FROM Movies_Directors AS d
       JOIN Roles AS a
         ON d.Movie_ID = a.Movie_ID
      GROUP BY d.Director_ID, A.Actor_ID
    )
SELECT q3.Director_ID, cte.Actor_ID
  FROM (SELECT cte.Director_ID, MAX(cte.Num_Joint_Movies) AS Max_Joint_Movies
          FROM cte
         GROUP BY cte.Director_ID
       ) AS q3
  JOIN cte
    ON q3.Director_ID = cte.Director_ID AND q3.Max_Joint_Movies = cte.Num_Joint_Movies

Q6: ディレクターのコラボレーションの最大数

私が回答を始めてから質問が少し変更されたため、上記の結果は正確に必要なものではない可能性がありますが、修正された質問では何が必要かが明確になりません. ただし、質問を回答可能なサブクエリに分割する一般的な手法は価値があります。これは、同様のクエリにアプローチする方法です。最も協力した監督 + 俳優の単一の組み合わせを探している場合は、Q3 を変更して、すべての監督にわたる共同映画の最大数を見つける必要があります。

SELECT MAX(n.num_joint_movies) AS max_joint_movies
  FROM (SELECT d.Director_ID, A.Actor_ID, COUNT(*) AS num_joint_movies
          FROM Movies_Directors AS d
          JOIN Roles AS a
            ON d.Movie_ID = a.Movie_ID
         GROUP BY d.Director_ID, A.Actor_ID
       ) AS n

Q7: 最も頻繁にコラボレーションした俳優と監督

Q6 と Q2 を再度組み合わせる必要があります。

SELECT q2.Director_ID, q2.Actor_ID
  FROM (SELECT MAX(n.Num_Joint_Movies) AS Max_Joint_Movies
          FROM (SELECT d.Director_ID, A.Actor_ID, COUNT(*) AS Num_Joint_Movies
                  FROM Movies_Directors AS d
                  JOIN Roles AS a
                    ON d.Movie_ID = a.Movie_ID
                 GROUP BY d.Director_ID, A.Actor_ID
               ) AS n
       ) AS q3
  JOIN (SELECT d.Director_ID, A.Actor_ID, COUNT(*) AS Num_Joint_Movies
          FROM Movies_Directors AS d
          JOIN Roles AS a
            ON d.Movie_ID = a.Movie_ID
         GROUP BY d.Director_ID, A.Actor_ID
        ) AS q2
     ON q3.Max_Joint_Movies = q2.Num_Joint_Movies
于 2013-02-01T04:02:09.340 に答える
2

max()これには関数を使用する必要があります。

SELECT
max(collaborations) 
FROM movies_directors mov 
INNER JOIN roles r 
     on r.movie_id=mov.movie_id 
GROUP BY mov.director_id,r.actor_id
于 2013-02-01T04:08:02.643 に答える
0

あなたが望むものを達成するための簡潔な方法は次のとおりです。

  select top (1) with ties
    M.director_id,
    R.actor_id,
    COUNT(movie_id) as MovieCount
  from movies_directors as M
  join roles as R
  on M.movie_id = R.movie_id
  group by
    M.director_id,
    R.actor_id
  order by rank() over (
  partition by director_id
  order by COUNT(movie_id) desc
  )
于 2013-02-01T04:08:11.340 に答える