我的家庭作业问题略有问题。我不是在寻找答案,但我想知道如何解决这个问题。
查找未显示电影“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
答案 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_id
和theatre_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'
)