2016-04-29 7 views
1

私は3つのテーブルactor,movie,castingを持っています。私は俳優 "ART Garfunkel"と仕事をした人たちを見つけなければなりません。「Art Garfunkel」で働いていたすべての人をリストするには?

解決方法がありますが、次のクエリの仕組みを理解できません。

**movie** **actor** **casting** 
    id   id   movieid 
    title  name   actorid 
    yr      ord 
    director  
    budget  
    gross   

SELECT a.name 
    FROM (SELECT movie.* 
      FROM movie 
      JOIN casting 
      ON casting.movieid = movie.id 
      JOIN actor 
      ON actor.id = casting.actorid 
     WHERE actor.name = 'Art Garfunkel') AS m 
    JOIN (SELECT actor.*, casting.movieid 
      FROM actor 
      JOIN casting 
      ON casting.actorid = actor.id 
     WHERE actor.name != 'Art Garfunkel') as a 
    ON m.id = a.movieid; 

1以上ソリューション:

SELECT actor.name FROM casting 
     JOIN movie ON movie.id=casting.movieid 
     JOIN actor ON actor.id=casting.actorid 
    WHERE actor.name !='Art Garfunkel' 
    AND 
     movie.id IN(SELECT movie.id FROM casting 
      JOIN movie ON movie.id=casting.movieid 
     JOIN actor ON actor.id=casting.actorid 
     WHERE actor.name='Art Garfunkel') 

答えて

0

それはここに私の提案ソリューションです...あなたの質問を理解することは困難です。

SELECT 
    * 
FROM 
    Actor A 
INNER JOIN 
    Casting C 
ON 
    C.ActorID = A.ID 
WHERE C.MovieID IN (
    SELECT 
     C.MovieID 
    FROM 
     Casting C 
    INNER JOIN 
     Actor A 
    ON 
     C.ActorID = A.ID 
    WHERE 
     Actor = 'Art Garfunkel' 
) 
WHERE 
     Actor <> 'Art Garfunkel' 

サブクエリが最初にすべての映画を見つけました第2の外部クエリは、前記サブクエリから返されるムービー内で動作したすべてのアクタを見つける。

+0

はウル問い合わせについては、以下のエラーを取得しています。 エラー: テーブル 'gisq.Actor'が存在しません – kal

+0

SQL Serverを使用していますか?あなたは間違った状況にある可能性が高いです。クエリの最初に 'USE [Your_Database_Name] GO'を試してみてください。 – rjmd

+0

実際にSQl ZOO webstieを使って(練習) http://sqlzoo.net/wiki/More_JOIN_operations – kal

0

ここで同じことを単純化したバージョンです:

select actor.name 
from (
    select movieid from casting 
    join actor on actor.id = casting.actorid 
     and actor.name = 'Art Garfunkel' 
) ag_movies 
join casting on ag_movies.movieid = casting.movidid 
join actor on actor.id = casting.actorid 
    and actor.name != 'Art Garfunkel' 

ユアーズはほぼ同じ手順に従います:

  1. はアート・ガーファンクルがしていたすべての映画のためにMOVIEIDを取得
  2. 下さい。それらすべての映画のキャストリスト。
  3. アートガーファンクル以外のキャストリストからアーティスト名を取得します。

キャスティングテーブルは、多数の映画館で多くのアクタを使用できるようにするクロスルックアップテーブルです。キャスティングテーブルを通して、アートがあったすべての映画を見つけなければならず、その映画の他の俳優を見つけるためにそれを逆転させる必要があります。

ジョインとは、ジョイン基準に一致する両方のテーブルのローだけが結果に含まれることを意味します。したがって、on actor.id = casting.actorid and actor.name = 'Art Garfunkel'は一致するIDで表を接続しますが、その結果はアクター名がArt'sのIDのみに限定されます。これらのクエリで使用される結合は、集合理論との交差と同じ意味です。

括弧内のサブセレクトは、他のテーブルと同じように親クエリで使用できる一時テーブル(この例ではag_moviesという名前)を作成します。ここで

0

は、MySQLのためのソリューションです:

SELECT name FROM actor JOIN casting ON actor.id = actorid JOIN movie ON movie.id = movieid WHERE movie.id IN (
SELECT movieid FROM casting 
WHERE actorid IN (SELECT id FROM actor WHERE name = 'Art Garfunkel') 
) AND actor.name != 'Art Garfunkel';