我正在练习一些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我的任务是在做的时候不使用/存在......
谢谢!
答案 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
子查询中选择任何。选择一个列会产生误导。screeningid
或idscreening
,但不能同时使用两者。)编辑:
如果您想要观看所有电影的客户,那么我会将其视为:
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人也可以了解这个问题。 “不存在”的方法更难以理解。