SQL select语句 - 任何关键字?

时间:2016-01-28 04:30:43

标签: mysql sql

我的家庭作业问题略有问题。我不是在寻找答案,但我想知道如何解决这个问题。

查找未显示电影“Gone Girl”的影院名称和电话号码

select distinct theatrename
from shownat
where movietitle != 'Gone Girl';

我只需要帮助解决问题的第二部分。如何找到没有显示某部电影的影院。这个问题是,如果它进入Great Escape 14剧院的第二部电影,那么where语句就变为真,并将其作为结果中的值提供。如果我使用另一种语言,我会在剧院场地上使用foreach循环,然后检查数值。必须有一种有效的方法在sql中执行此操作。

我会在这里给你一些示例数据。

Movie Theatre Names              Movie Titles
Great Escape 14                  Big Hero 6
Great Escape 14                  Interstellar
Great Escape 14                  Gone Girl
Great Escape 14                  Public Enemies
Great Escape 14                  The Departed
AMC Newport On The Levee 20      Big Hero 6
AMC Newport On The Levee 20      Interstellar
AMC Newport On The Levee 20      District 9
AMC Newport On The Levee 20      A Perfect Getaway
AMC Newport On The Levee 20      Away We Go
AMC Newport On The Levee 20      Up
AMC Newport On The Levee 20      The Departed

2 个答案:

答案 0 :(得分:1)

许多响应者似乎都忽视了这一点。如果您只是在OP的问题或Erik,SIDU,Jorge Campos提供的任何变体中进行查询,您还将获得显示Gone Girl和另一部电影的剧院名称,这些不是什么OP希望。

答案是:

SELECT DISTINCT theatrename
FROM shownat SN1
WHERE NOT EXISTS (
  SELECT theatrename
  FROM shownat SN2
  WHERE SN1.theatrename = SN2.theatrename
  AND SN2.movietitle = 'Gone Girl'
);

“给我所有的电影院,以免在那些电影院中出现Gone Girl。” (SQL未经测试,因此可能在细节方面有误,但在概念上可靠)。

你还可以采用其他几种方式,所有这些方法都涉及子查询:“找到所有影院,其中标题不是Gone Girl的电影数量为零”,例如。

BTW,理想情况下,您将规范化您的表,因此您将拥有theatres表(带有ID)和movies表(带有ID)和screenings表格(movie_idtheatre_id);这会改变答案,但从长远来看对你来说更好。

答案 1 :(得分:1)

假设我们有2个基表:剧院和显示

如果所有theatrename都存在于表格中,那么作者已经获得了最好的SQL:

SELECT distinct theatrename
FROM shownat
WHERE movietitle != 'Gone Girl';

但是如果某些theatrename没有在shownat中退出,则以下SQL是正确的:

SELECT theatrename
FROM theatres
WHERE theatrename NOT IN (
    SELECT theatrename 
    FROM shownat
    WHERE movietitle = 'Gone Girl'
)