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 的星星

我发现这些步骤很有帮助:

  1. 获取Kevin Bacon的ID,条件是1958年出生的Kevin Bacon
  2. 使用他的 ID 获取 Kevin Bacon 的电影 ID(提示:将他在 table1 中的 ID 与 table2 链接)
  3. 获取电影ID相同的其他明星ID
  4. 获取这些明星的名字,并排除 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 中使用 DISTINCTNOT 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