问题
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:
- Get the ID of Kevin Bacon, with the criteria that it's the Kevin Bacon who was born in 1958
- Get the movie IDs of Kevin Bacon using his ID (hint: linking his ID in table1 with table2)
- Get other stars' IDs with the same movie IDs
- 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