2

3 つのテーブルがあります。俳優のリスト (actors.sql)、映画のリスト (movies.sql)、各映画で演じた俳優のリスト (およびその役職の roles.sql) です。各テーブルのスニペットは次のとおりです。sqlsnippet

表ははるかに長く、この画像には表示されていない数千のエントリがあります。以前の練習問題は、俳優が出演した各映画の表を表示することでした (HTML フォームと別のページの PHP から取得した俳優名)。そのためのコードは次のとおりです。

    SELECT actor_id, movie_id, name, year
    FROM roles r
    JOIN actors a ON a.id = r.actor_id
    JOIN movies m ON m.id = r.movie_id
    WHERE first_name = '$actor_first' AND last_name = '$actor_last'
    ORDER BY year DESC;

ここで、テーブルを相互参照して、特定の俳優と一緒に仕事をしたことがある人や、彼らがどの映画と仕事をしたかを調べたいと思います。「ケビン・スペイシー」が「ウィル・スミス」と一緒に出演した映画を知りたいとします。それらを一覧表示したテーブルが必要です。問題は、方法がわからないことです。

任意のヒント?

4

2 に答える 2

1

受け入れられた答えの代わりに、このようにmovie_IDして、結果のレコード数を数えることができます。これは、条件で指定したアクターの数と同じです。

SELECT  m.*
FROM    movies m
        INNER JOIN
        (
            SELECT  a.movie_ID
            FROM    roles a
                    INNER JOIN actors b
                        ON a.actor_ID = b.id
            WHERE   (b.first_name = 'Kevin' AND  b.last_name = 'Spacey') OR
                    (b.first_name = 'Will' AND  b.last_name = 'Smith')
            GROUP BY a.movie_ID
            HAVING COUNT(*) = 2
        ) n ON m.movie_ID = n.movie_ID

クエリで何が起こっていますか?

WHERE   (b.first_name = 'Kevin' AND  b.last_name = 'Spacey') OR
        (b.first_name = 'Will' AND  b.last_name = 'Smith')

ORこれは、条件演算子を追加することで、必要な数のアクターを見つける場所です

HAVING COUNT(*) = 2

の値は、COUNT検索するアクターの数と等しくなければなりません。

同じ映画で一緒に働いた 3 人の俳優を見つける必要がある場合は、WHERE節 and と節の値のみを変更する必要がありますHAVING

WHERE   (b.first_name = 'Kevin' AND  b.last_name = 'Spacey') OR
        (b.first_name = 'Will' AND  b.last_name = 'Smith') OR
        (b.first_name = 'Ben' AND  b.last_name = 'Affleck')
GROUP BY a.movie_ID
HAVING COUNT(*) = 3
于 2012-11-29T02:41:54.230 に答える