我正在练习一些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我的任务是在这样做时使用不存在/存在...
谢谢!
你的查询基本上没问题,尽管子查询中不需要select distinct
:
select p.idclient
from screening_occapancy p
where not exists (select 1
from screening s
where s.screeningid = p.idscreening
);
笔记:
- 您可以在
exists
子查询中选择任何内容。 选择列具有误导性。 - 使用表别名并将其用于所有列引用,尤其是在相关的子查询中。
- 如果你正在设计表,我建议你给主键和外键相同的名称(
screeningid
或idscreening
,但不能同时命名)。
编辑:
如果你想要看过所有电影的客户,那么我会这样处理:
select p.idclient
from screening_occapancy p
group by p.idclient
having count(distinct p.screening_occapancy p) = (select count(*) from screening);
为什么不计算screening_table中的电影数量,将其加载到变量中,然后根据变量检查查询结果的结果?
将电影数量加载到变量中(由 idMovie 标识):
SELECT count(DISTINCT(idmovie)) FROM screening INTO @number_of_movies;
根据变量检查查询结果:
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 ;
如果要查找参加所有放映的所有客户,请将 idmovie 替换为 screeningid。
即使是对MySQL相对较新的人也可以理解这个查询。"不存在"的方法更难理解。