数据库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
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一起选择星星
获取自上而下的层次结构中的值,但请确保您在正确的域中进行搜索。获取所需的第一名称,但在取决于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