SQL程序,用于查找与另一个表中的所有行关联的一个表中的行

时间:2012-10-08 18:57:20

标签: sql

我有三张桌子

  • 电影(mov_id(key),name,actor,...)
  • customer(cust_id(key),name,gender,....)
  • watches_movie(cust_id mov_id,movie_price,...)

我想知道所有与特定演员观看过所有电影的女性顾客的名字。

我在编写SQL查询时遇到了麻烦。

有人可以帮帮我吗?

2 个答案:

答案 0 :(得分: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. 我想知道所有女性顾客的名字
    • 来自客户+其中c.gender ='女性'
  2. 所有与特定演员合作的电影
    • 加入电影+ m.actor ='演员
  3. 谁看过2. ALL the movies with a particular actor。因此,让我们找到客户/电影组合的所有watches_movie记录
    • 在客户/电影上留下联合watches_movie
  4. 如此多的记录,让我们将其分解并分组进行检查
    • group by c.cust_id,c.name,c.gender
    • 注意:根据此处和SELECT
    • 中的客户表列出尽可能多的列
  5. 这是我们测试这个事实的地方。如果顾客观看了(m)中的所有电影,那么每个(m)记录将有(w)记录
    • 有计数(distinct m.mov_id)= count(distinct w.mov_id)
    • 注意:我们使用distinct,因为顾客可以观看3次电影,而不会分明3次

答案 1 :(得分: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
     )
     );

如果有大量数据,不会太快,但会做你想做的事。

顺便说一句,你知道你对电影表中存储的演员有一个规范化问题,对吗?