CS50 Pset 7 13.sql, I can't solve it, nested sqlite3 database

风格不统一 提交于 2020-05-28 08:19:33

问题


DataBase movies.db

tables

directors (movie_id, person_id)

movies (id, title, year)

people (id, name, birth)

ratings (movie_id, rating, votes)

stars (movie_id, person_id)

you can download the database.

Question

I'm new in programming, so I decided, to begin with, CS50 Harvard course here is the problem and the test solution:

In 13.sql, write a SQL query to list the names of all people who starred in a movie in which Kevin Bacon also starred. Your query should output a table with a single column for the name of each person. There may be multiple people named Kevin Bacon in the database. Be sure to only select the Kevin Bacon born in 1958. Kevin Bacon himself should not be included in the resulting list.

solution hint

Executing 13.sql results in a table with 1 column and 176 rows.

executing code in PowerShell or bash cat 13.sql | sqlite3 movies.db

My Code:

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");

problem:

when I execute code it stop working, I can't choose stars with Kevin


回答1:


Get values in top-bottom hierarchy but make sure that you're searching for it in the correct domain. GET the name which is the first thing needed but search for it in the correct domain which is dependent on person_id, in turn to movie_id. Finally to invoke the condition, we've to recall people.id as the condition is dependent on data in the people table. It's essential to do the needed JOINs at each step.

To remove Kevin Bacon from results, you can use the EXCEPT keyword and specifically choose him in the other query.

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



回答2:


I found these steps helpful:

  1. Get the ID of Kevin Bacon, with the criteria that it's the Kevin Bacon who was born in 1958
  2. Get the movie IDs of Kevin Bacon using his ID (hint: linking his ID in table1 with table2)
  3. Get other stars' IDs with the same movie IDs
  4. Get the name of these stars, and exclude Kevin Bacon (because the spec says he shouldn't be included in the resulting list)

Note: In the first line of your code, instead of COUNT(name), you can use SELECT name to get the people's names




回答3:


I try the steps in Zara answer:

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")
                    )
)

Result:

I must have done the wrong steps to get this result

Expected 176 rows but got one row "Steve Guttenberg"



来源:https://stackoverflow.com/questions/60731243/cs50-pset-7-13-sql-i-cant-solve-it-nested-sqlite3-database

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!