CS50 Pset 7 13.sql,我解决不了,嵌套sqlite3数据库
CS50 Pset 7 13.sql, I can't solve it, nested sqlite3 database
数据库movies.db
tables
董事(movie_id、person_id)
电影(id、标题、年份)
人(身份证、姓名、出生)
评分(movie_id,评分,票数)
星数(movie_id、person_id)
您可以下载database.
问题
我是编程新手,所以我决定,首先,这里的 CS50 哈佛课程是问题和测试 solution:
在 13.sql 中,编写一个 SQL 查询以列出主演过凯文·贝肯 (Kevin Bacon) 主演的电影的所有人的姓名。
您的查询应该输出一个 table,每个人的名字只有一列。
数据库中可能有多个名为 Kevin Bacon 的人。务必只select 1958年出生的凯文培根。
Kevin Bacon 本人不应包含在结果列表中。
解决方法提示
执行 13.sql 结果 table 有 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 的星星
我发现这些步骤很有帮助:
- 获取Kevin Bacon的ID,条件是1958年出生的Kevin Bacon
- 使用他的 ID 获取 Kevin Bacon 的电影 ID(提示:将他在 table1 中的 ID 与 table2 链接)
- 获取电影ID相同的其他明星ID
- 获取这些明星的名字,并排除 Kevin Bacon(因为规范说他不应包含在结果列表中)
注意:在代码的第一行中,您可以使用 SELECT name
而不是 COUNT(name)
来获取人员姓名
我试试Zara答案中的步骤:
SELECT people.name
FROM people
WHERE people.id = (
SELECT stars.person_id
FROM stars
JOIN movies ON stars.movie_id = movies.id
WHERE movies.id = (
SELECT movies.id
FROM movies
JOIN stars ON stars.movie_id = movies.id
JOIN people ON stars.person_id = people.id
WHERE people.id = (
SELECT id
FROM people
WHERE birth = 1958 AND name = "Kevin Bacon")
)
)
结果:
我一定是做错了步骤才得到这个结果
预期 176 行但得到了一行 "Steve Guttenberg"
在自上而下的层次结构中获取值,但确保您在正确的域中搜索它。 GET 名称,这是第一个需要的东西,但在依赖于 person_id 的正确域中搜索它,然后是 movie_id。最后要调用条件,我们必须回忆一下 people.id,因为条件取决于人员 table 中的数据。在每个步骤中执行所需的 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
我通过在 SQL 中使用 DISTINCT
和 NOT EQUAL
运算符解决了这个问题。
以下是我采取的步骤:
SELECT DISTINCT(name)
FROM people
JOIN stars ON stars.person_id = people.id
JOIN movies ON movies.id = stars.movie_id
WHERE movies.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.name = "Kevin Bacon"
AND people.birth = 1958)
AND people.name != "Kevin Bacon";
结果是 176 行不同的姓名。
我没有使用任何连接,只是嵌套条件。
SELECT people.name FROM people
WHERE people.id IN
(
SELECT stars.person_id FROM stars
WHERE stars.movie_id IN
(
SELECT stars.movie_id FROM stars
WHERE stars.person_id IN
(
SELECT people.id FROM people
WHERE people.name = "Kevin Bacon" AND
people.birth = 1958
)
)
)
AND people.name != "Kevin Bacon"
GROUP BY people.name
数据库movies.db
tables
董事(movie_id、person_id)
电影(id、标题、年份)
人(身份证、姓名、出生)
评分(movie_id,评分,票数)
星数(movie_id、person_id)
您可以下载database.
问题
我是编程新手,所以我决定,首先,这里的 CS50 哈佛课程是问题和测试 solution:
在 13.sql 中,编写一个 SQL 查询以列出主演过凯文·贝肯 (Kevin Bacon) 主演的电影的所有人的姓名。 您的查询应该输出一个 table,每个人的名字只有一列。 数据库中可能有多个名为 Kevin Bacon 的人。务必只select 1958年出生的凯文培根。 Kevin Bacon 本人不应包含在结果列表中。
解决方法提示
执行 13.sql 结果 table 有 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 的星星
我发现这些步骤很有帮助:
- 获取Kevin Bacon的ID,条件是1958年出生的Kevin Bacon
- 使用他的 ID 获取 Kevin Bacon 的电影 ID(提示:将他在 table1 中的 ID 与 table2 链接)
- 获取电影ID相同的其他明星ID
- 获取这些明星的名字,并排除 Kevin Bacon(因为规范说他不应包含在结果列表中)
注意:在代码的第一行中,您可以使用 SELECT name
而不是 COUNT(name)
来获取人员姓名
我试试Zara答案中的步骤:
SELECT people.name
FROM people
WHERE people.id = (
SELECT stars.person_id
FROM stars
JOIN movies ON stars.movie_id = movies.id
WHERE movies.id = (
SELECT movies.id
FROM movies
JOIN stars ON stars.movie_id = movies.id
JOIN people ON stars.person_id = people.id
WHERE people.id = (
SELECT id
FROM people
WHERE birth = 1958 AND name = "Kevin Bacon")
)
)
结果:
我一定是做错了步骤才得到这个结果
预期 176 行但得到了一行 "Steve Guttenberg"
在自上而下的层次结构中获取值,但确保您在正确的域中搜索它。 GET 名称,这是第一个需要的东西,但在依赖于 person_id 的正确域中搜索它,然后是 movie_id。最后要调用条件,我们必须回忆一下 people.id,因为条件取决于人员 table 中的数据。在每个步骤中执行所需的 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
我通过在 SQL 中使用 DISTINCT
和 NOT EQUAL
运算符解决了这个问题。
以下是我采取的步骤:
SELECT DISTINCT(name)
FROM people
JOIN stars ON stars.person_id = people.id
JOIN movies ON movies.id = stars.movie_id
WHERE movies.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.name = "Kevin Bacon"
AND people.birth = 1958)
AND people.name != "Kevin Bacon";
结果是 176 行不同的姓名。
我没有使用任何连接,只是嵌套条件。
SELECT people.name FROM people
WHERE people.id IN
(
SELECT stars.person_id FROM stars
WHERE stars.movie_id IN
(
SELECT stars.movie_id FROM stars
WHERE stars.person_id IN
(
SELECT people.id FROM people
WHERE people.name = "Kevin Bacon" AND
people.birth = 1958
)
)
)
AND people.name != "Kevin Bacon"
GROUP BY people.name