小编典典

CS50 Pset 7 13.sql,我无法解决,嵌套了sqlite3数据库

sql

数据库movie.db

directors (movie_id, person_id)

movies (id, title, year)

people (id, name, birth)

ratings (movie_id, rating, votes)

stars (movie_id, person_id)

您可以下载
数据库

问题

我是编程的新手,所以我决定首先从CS50哈佛课程开始,这里是问题和测试解决方案

在13.sql中,编写一个SQL查询以列出曾在凯文·培根出演过的电影中出演过的所有人的名字。您的查询应该输出一个表格,其中每个人的名字都只有一列。数据库中可能有多个名为Kevin
Bacon的人。确保仅选择出生于1958年的凯文·培根。凯文·培根本人不应该包含在结果列表中。

解决方案提示

执行13.sql会导致表中有1列和176行。

在PowerShell或bash中执行代码 cat 13.sql | sqlite3 movies.db

我的代码:

SELECT COUNT(name)
FROM people 
JOIN stars ON stars.person_id = people.id 
JOIN movies ON movies.id = stars.movie_id 
WHERE people.id IN(
SELECT stars.person_id 
FROM stars 
GROUP BY stars.person_id 
HAVING name = "Kevin Bacon");

问题:

当我执行代码时,它停止工作,我无法与Kevin一起选择星星


阅读 224

收藏
2021-05-05

共1个答案

小编典典

获取自上而下的层次结构中的值,但请确保您在正确的域中进行搜索。获取所需的第一名称,但在取决于person_id的正确域中搜索该名称,而该域又取决于movie_id。最后,要调用该条件,我们必须重新调用people.id,因为条件取决于people表中的数据。必须在每个步骤中执行所需的JOIN。

要从结果中删除Kevin Bacon,可以使用EXCEPT关键字,并在其他查询中专门选择他。

SELECT name FROM people WHERE people.id
IN
( SELECT person_id FROM stars JOIN movies ON movies.id = stars.movie_id 
WHERE movie_id IN
( SELECT movie_id FROM movies JOIN stars ON stars.movie_id = movies.id JOIN people ON 
 people.id = stars.person_id WHERE people.id IN (
SELECT id FROM people WHERE people.name = "Kevin Bacon" AND people.birth = 1958 )))
EXCEPT
SELECT name FROM people WHERE people.name = "Kevin Bacon" AND people.birth = 1958
2021-05-05