【问题标题】:SQL not exists to find some issuesSQL不存在找一些问题
【发布时间】:2017-01-19 11:37:37
【问题描述】:

我正在练习一些 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 我的任务是在做的时候使用 not/exists...

谢谢!

【问题讨论】:

  • 子查询中不需要DISTINCT

标签: mysql sql not-exists


【解决方案1】:

您的查询基本没问题,尽管子查询中不需要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);

【讨论】:

  • 谢谢,但 my+your'e 查询无效(即使有一个客户观看了所有内容......)
【解决方案2】:

你为什么不计算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 替换为 screenshotid。
即使是对 MySQL 比较陌生的人也可以理解这个查询。 “不存在”的方法更难理解。

【讨论】:

    猜你喜欢
    • 2011-05-15
    • 2011-07-05
    • 2016-05-25
    • 2021-11-12
    • 2022-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多