SQL不存在以找到一些问题

时间:2017-01-19 11:37:38

标签: mysql sql not-exists

我正在练习一些SQL(对此新), 我有下表:

screening_occapancy(idscreening,row,col,idclient)
screening(screeningid,idmovie,idtheater,screening_time)

我试图创建一个查询来搜索哪些客户在“筛选”表中观看了所有电影并显示了他们的ID(idclient)。

这是我写的(不起作用):

select idclient from screening_occapancy p where not exists 
 (select screeningid from screening where screeningid=p.idscreening)

我知道这可能不是那么好所以请尽量解释我做错了什么。

P.S我的任务是在做的时候不使用/存在......

谢谢!

2 个答案:

答案 0 :(得分:0)

您的查询基本上没问题,但子查询中不需要select distinct

select p.idclient
from screening_occapancy p
where not exists (select 1
                  from screening s
                  where s.screeningid = p.idscreening
                 );

注意:

  • 您可以在exists子查询中选择任何。选择一个列会产生误导。
  • 使用表别名并将其用于所有列引用,尤其是在相关子查询中。
  • 如果您正在设计表格,我建议您为主键和外键指定相同的名称(screeningididscreening,但不能同时使用两者。)

编辑:

如果您想要观看所有电影的客户,那么我会将其视为:

select p.idclient
from screening_occapancy p
group by p.idclient
having count(distinct p.screening_occapancy p) = (select count(*) from screening);

答案 1 :(得分:0)

为什么不计算screening_table中的电影数量,将其加载到变量中并根据变量检查查询结果?

将电影数量加载到变量中(由idmovie识别):

    SELECT A.idclient, 
    count(DISTINCT(idmovie)) AS number_of_movies_watched,
    FROM screening_occapancy A
    INNER JOIN screening B
    ON(A.idscreening = B.screeningid)
    GROUP BY A.idclient
    HAVING number_of_movies_watched = @number_of_movies ;

根据变量检查查询结果:

START TRANSACTION;   

INSERT INTO ondersoort (id, naam) VALUES (NULL, 'data');  
INSERT INTO hoofdtoonder (pkey, Id, idondersoorten) VALUES (NULL, NULL, LAST_INSERT_ID());
INSERT INTO vogelsoort (id, naam, idhooftoonder) VALUES (NULL, 'data', LAST_INSERT_ID());

COMMIT;

如果您想找到所有参加过所有放映的客户,请用screenid替换idmovie 即使是相对较新的MySQL人也可以了解这个问题。 “不存在”的方法更难以理解。