Почему этот SQL запрос не работает? CS50 Pset7 - фильмы - PullRequest
2 голосов
/ 09 января 2020

В настоящее время я работаю над этим https://cs50.harvard.edu/x/2020/psets/7/movies/ и пытаюсь завершить 9. sql.

Там есть база данных, называемая "фильмы", с таблицами: фильмы (столбцы: id, название, год), люди (id, имя, рождение) и звезды (movie_id, person_id).

Задача:

написать запрос SQL, чтобы перечислить имена всех людей, которые снялись в фильме mov ie, выпущенном в 2004 году, с разбивкой по году рождения. Он должен вернуть 18 013 имен.

Пока что это то, что я сделал:

SELECT count(distinct name) 
from people
join stars on stars.person_id = people.id
join movies on stars.movie_id = movies.id
WHERE year = 2004;

Однако это возвращает только 17 965 ...

Кто-нибудь может понять, почему это может быть?

Ответы [ 2 ]

5 голосов
/ 09 января 2020

Если вы count(distinct person_id), то вы получите 18013. Разумно, что имя не уникально. Что неразумно, так это указание на экзамене, согласно которому вы должны указывать только имя.

Один из способов правильно различать имена - выполнить это:

SELECT p.name
from people p
where p.id in (
select distinct s.person_id
from stars s join movies m on s.movie_id = m.id
WHERE m.year = 2004)

И если вы сделаете это таким образом тогда вам даже не нужен distinct из-за определения оператора in. Но вы, вероятно, получите один и тот же план выполнения независимо от этого.

На мой взгляд, можно перечислить p.name несколько раз, если он принадлежит другому человеку. Написанный вами запрос был бы нормальным, если бы правило начиналось со следующих слов:

Если имя человека ...

вместо этих слов:

Если человек ...

Что мне что-то напоминает C. J. Дата сделал в классе один день. Он положил фольгу на свой проектор, который проецировал изображение дымящейся трубки на стене. Затем он спросил: что это?

  • Труба, сказал один парень (вероятно, я).
  • Изображение трубы, которое сказал другой парень.
  • Наконец Кто-то сказал, что изображение трубы спроецировано на стену.

Поскольку это был класс базы данных, а не класс физики, никто не осмелился быть умным-а **.

0 голосов
/ 09 января 2020

Вам нужно посчитать количество уникальных имен? В этом случае будет меньше

...