CS50 Pset 7 13. sql, я не могу решить, вложенная база данных sqlite3 - PullRequest
0 голосов
/ 18 марта 2020

База данных movies.db

таблиц

директоров (movie_id, person_id)

фильмы (идентификатор, название, год)

человек (идентификатор, имя, рождение)

оценки (movie_id, рейтинг, голоса)

звезды ( movie_id, person_id)

Вы можете загрузить базу данных .

Вопрос

Я новичок в программировании, поэтому я решил, для начала, CS50 Гарвардский курс, вот проблема и тест решение :

В 13. sql, напишите SQL запрос, чтобы перечислить имена всех людей, которые снялись в фильме ie, в котором также играл Кевина Бэкона. Ваш запрос должен вывести таблицу с одним столбцом для имени каждого человека. В базе данных может быть несколько человек по имени Кевин Бэкон. Обязательно выбирайте только Кевина Бэкона, родившегося в 1958 году. Сам Кевин Бэкон не должен быть включен в итоговый список.

подсказка о решении

Выполнение 13. sql в результате получается таблица с 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");

проблема:

когда я выполняю код, он перестает работать, я не могу выбрать звезды с Кевином

Ответы [ 3 ]

0 голосов
/ 25 марта 2020

Я пытаюсь выполнить шаги в ответе Зары:

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 строк, но есть одна строка "Стив Гуттенберг"

0 голосов
/ 21 апреля 2020

Получите значения в иерархии сверху вниз, но убедитесь, что вы ищете их в правильном домене. ПОЛУЧИТЕ имя, которое является первым необходимым, но ищите его в правильном домене, который зависит от person_id, в свою очередь, для movie_id. Наконец, чтобы вызвать условие, мы должны вспомнить people.id, так как условие зависит от данных в таблице people. На каждом шаге необходимо выполнять необходимые СОЕДИНЕНИЯ.

Чтобы удалить Кевина Бэкона из результатов, вы можете использовать ключевое слово 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
0 голосов
/ 22 марта 2020

Мне показались эти шаги полезными:

  1. Получите удостоверение личности Кевина Бэкона с критериями того, что это Кевин Бэкон, родившийся в 1958 году
  2. Получите мов ie Идентификаторы Кевина Бэкона по его идентификатору (подсказка: связать свой идентификатор в таблице 1 с таблицей 2)
  3. Получить идентификаторы других звезд с таким же мовом ie идентификаторы
  4. Получить имя этих звезд, и исключить Кевина Бэкона (поскольку спец. c говорит, что его не следует включать в итоговый список)

Примечание. В первой строке кода вместо COUNT(name) вы можете используйте SELECT name, чтобы получить имена людей

...