0

同様の質問を見つけましたが、最終的にはまったく異なり、私の問題に答えるものはありません。

私はmySQLを使用しています

私は3つのキーを含む3つのテーブルmovie、artist、roleを好むテーブルmovie_artist_roleを持っています

mo_id
ar_id
ro_id.

テーブルムービーには含まれています

mo_id
mo_title

テーブルのアーティストが含まれています

ar_id
ar_name

テーブル ロールに含まれる

ro_id
ro_name (actor or producer for instance)

映画のリストを表示したいのですが、各映画の俳優と監督

それを得る最も効率的な方法は何ですか?複数の左結合を持つ1つの一意のクエリで可能ですか?

ありがとう

4

3 に答える 3

0
select movie.mo_title, artist.ar_name, role.ro_name
from movie_artist_role 
left join movie on movie.mo_id = movie_artist_role.mo_id
left join artist on artist.ar_id = movie_artist_role.ar_id
left join role on role.ro_id = movie_artist_role.ro_id
order by movie.mo_tile, artist.ar_name

同様の映画データベースがあります。あなたが定義した「役割」テーブルは不要だと思います-「映画」テーブルに直接リンクする別の「監督」テーブルがあります。同じ映画に2人の監督がいることは非常にまれです。 (例:コーン兄弟)二人はよく一緒に仕事をする傾向があるので、一人の監督とみなすことができます。

内部結合ではなく左結合を使用すると、監督や俳優がリンクされていない映画を表示できます。

于 2012-07-20T04:48:43.030 に答える
0

複数inner join(3 つすべてのテーブルからすべてを取得) を接続foreign keysすると、各映画、俳優、監督の情報のリストが表示されます。

SELECT * FROM movie_artist_role mar
INNER JOIN movie m ON mar.mo_id = m.mo_id
INNER JOIN artists a ON mar.ar_id = a.ar_id
INNER JOIN role r ON mar.ro_id = r.ro_id
ORDER BY m.mo_title, r.role_name

WHERE句を使用すると、その映画または俳優の詳細がわかります。例えば..

SELECT * FROM movie_artist_role mar
INNER JOIN movie m ON mar.mo_id = m.mo_id
INNER JOIN artists a ON mar.ar_id = a.ar_id
INNER JOIN role r ON mar.ro_id = r.ro_id
WHERE a.ar_name = 'Jack Black' ORDER BY m.mo_title, r.role_name

特定のテーブルからの特定のデータのみが必要な場合は、次のように言いfilmます...上で行われたことのほとんどが逆になります。

SELECT * FROM movie m
INNER JOIN movie_artist_role mar ON mar.mo_id = m.mo_id
INNER JOIN artists a ON mar.ar_id = a.ar_id
INNER JOIN role r ON mar.ro_id = r.ro_id
ORDER BY m.mo_title, r.role_name

またはartists...

SELECT * FROM artists a
INNER JOIN movie_artist_role mar ON mar.ar_id = a.ar_id
INNER JOIN movie m ON mar.mo_id = m.mo_id
INNER JOIN role r ON mar.ro_id = r.ro_id
ORDER BY m.mo_title, r.role_name

などなど

于 2012-07-20T04:49:09.763 に答える
0

LEFT JOINS は問題なく動作するはずです。

SELECT m.mo_title AS movie_title, 
       (SELECT group_concat(aIn.ar_name)
        FROM movie_artist_role AS marIn
            LEFT JOIN role AS rIn ON rIn.ro_id = marIn.ro_id
            LEFT JOIN artist AS aIn ON aIn.ar_id = marIn.ao_id
        WHERE rIn.ro_name = 'producer'
            AND marIn.mo_id = m.id ) AS producers,

       (SELECT group_concat(aIn.ar_name)
        FROM movie_artist_role AS marIn
            LEFT JOIN role AS rIn ON rIn.ro_id = marIn.ro_id
            LEFT JOIN artist AS aIn ON aIn.ar_id = marIn.ao_id
        WHERE rIn.ro_name = 'actor'
            AND marIn.mo_id = m.id ) AS actors
FROM movie AS m

これはテストされていませんが、次のような行を返す必要があります。

movie_title       |      producers       |     actors
-----------------------------------------------------------
Star Treck          JJ Abrams               Chris Pine, Simon Pegg, Zachery
于 2012-07-20T04:49:40.183 に答える