おそらく、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