DataBase movies.db
tables
directors (movie_id, person_id)
movies (id, title, year)
people
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"
I did it without using any Join, just nesting the conditions.
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
I found these steps helpful:
Note: In the first line of your code, instead of COUNT(name)
, you can use SELECT name
to get the people's names
I solved this problem by using DISTINCT
and NOT EQUAL
operator in SQL.
Here are the steps I took:
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";
Result is 176 distinct rows of names.
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