-2

20本以上の映画を監督し、彼が監督したすべての映画に出演したすべての男性監督の名前が欲しいです。彼が映画をキャストしたが、それを監督していない場合、それは大丈夫です、そして私はまだ彼の名前が欲しいです。彼が映画を監督したが、それをキャストしていない場合、私は彼をもう望んでいません。

SELECT p.firstname, 
    p.lastname 
FROM person p 
WHERE p.gender = 'M' AND
(
    SELECT COUNT(*)
    FROM filmparticipation fpd 
    WHERE p.personid = fpd.personid AND
        fpd.parttype = 'director' AND
        (
            SELECT COUNT(*) 
            FROM filmparticipation c 
            WHERE c.personid = fpd.personid AND
                c.filmid = fpd.filmid AND
                c.parttype = 'cast'
        ) > 0
) >= 20;

これは私の複数の試みの1つにすぎません。副次的な質問として、なぜそれが機能しないのですか?キャストされたmovie-idなどに正しい指示されたmovie-idをチェックしていることを確認します。

4

1 に答える 1

1

次のようになります。

SELECT p.firstname, p.lastname 
FROM   person p
JOIN  (
   SELECT fd.personid
   FROM   filmparticipation fd
   LEFT   JOIN filmparticipation fc USING (personid, filmid)
   WHERE  fd.parttype = 'director'
   AND    fc.parttype = 'cast'
   GROUP  BY fd.personid
   HAVING count(*) > 20  -- 21+ movies directed (NULL not counted)
   AND    NOT bool_or(fc.personid IS NULL) -- no movie directed but not cast
   ) AS fp USING (personid)
WHERE  p.gender = 'M';

サブクエリ I ではLEFT [OUTER] JOIN、同じ映画の同じ人物が監督および出演したすべての行 - 彼だけが残りを監督した行は で満たされていNULLます。それが a のするLEFT JOINことです。これは、同じ人物が同じ映画で同じ役割を演じられるのは1 回だけであることを前提としています(UNIQUE または PK 制約!)。

でグループ化するpersonidと、20 行を超える結果になる必要があり、どのキャストも にするpersonidことはできませんNULLJOINperson テーブルに追加し、男性に限定すれば完了です。

それを解決するには多くの方法がありますが、これは最も速い方法の 1 つです。

于 2012-10-31T20:58:27.330 に答える