0

我有三张桌子

  • 电影 (mov_id(key), 姓名, 演员,...)
  • 客户(cust_id(key),姓名,性别,....)
  • watch_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. 我想知道所有女性顾客的名字
    • 来自客户 + where c.gender = 'Female'
  2. 特定演员的所有电影
    • 加入电影 + m.actor = '演员
  3. 谁看过2. ALL the movies with a particular actor。所以让我们找到客户/电影组合的所有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)
    • 注意:我们使用 distinct 是因为客户可能会观看 3 次电影,如果没有 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 回答