0

私は3つのテーブルを持っています

  • 映画(mov_id(key)、name、actor、...)
  • 顧客(cust_id(key)、name、gender、....)
  • watchs_movie(cust_id mov_id、movie_price、...)

特定の俳優と一緒にすべての映画を見たすべての女性客の名前を知りたいです。

このためのSQLクエリを作成するのに問題があります。

誰かが私を助けることができますか?

4

2 に答える 2

1
   select c.cust_id, c.name, c.gender
     from customer c
     join movies m on m.actor = 'Actor'
left join watches_movie w on w.cust_id=c.cust_id and m.mov_id=w.mov_id
    where c.gender = 'Female'
 group by c.cust_id, c.name, c.gender
   having count(distinct m.mov_id) = count(distinct w.mov_id)

壊す:

  1. 女性客全員の名前を知りたい
    • from customer + where c.gender = '女性'
  2. 特定の俳優のすべての映画
    • 映画に参加 + m.actor = '俳優
  3. 見た人2. ALL the movies with a particular actor。それでは、customer/movie の組み合わせについて、watches_movie レコードをすべて見つけてみましょう。
    • 左 顧客/映画の両方で Watches_movie に参加
  4. あまりにも多くの記録があるので、顧客ごとに分割して、グループで調べてみましょう
    • c.cust_id、c.name、c.gender でグループ化
    • 注: ここと SELECT で、顧客テーブルから必要な数の列をリストします。
  5. ここで、この事実をテストします。顧客が (m) のすべての映画を視聴した場合、(m) レコードごとに (w) レコードが存在します。
    • count(distinct m.mov_id) = count(distinct w.mov_id) を持つ
    • 注: 顧客が映画を 3 回視聴する可能性があるため、distinct を使用します。これは、distinct なしで 3 回カウントされます。
于 2012-10-08T19:24:12.527 に答える
0

このクエリは、視聴していない映画が存在しないことが真実であるすべての顧客を検索します。

 SELECT * FROM customer WHERE gender = 'F' AND NOT EXISTS 
     (
     SELECT * FROM movies WHERE actor = 'Particular Actor' AND  mov_id NOT IN 
     (
      SELECT mov_id FROM watches_movie WHERE cust_id = customer.cust_id
     )
     );

大量のデータがある場合は速すぎませんが、必要なことは実行できます。

ところで、ムービー テーブルに保存されているアクターに正規化の問題があることはご存知ですよね?

于 2012-10-08T19:13:28.897 に答える