SQL-запрос: список всех актеров, которые появились в 40 или более триллерах, в порядке убывания - PullRequest
0 голосов
/ 09 октября 2018

Для схемы базы данных:

actor (id, fname, lname, gender)
movie (id, name, year)
directors (id, fname, lname)
casts (pid, mid, role)
movie_directors (did, mid)
genre (mid, genre)

Задача, которую я пытаюсь решить, состоит в следующем: Перечислите всех актеров, появившихся в 40 или более триллерах, в порядке убывания количества триллеров, в которых они появились.Верните имена и фамилии актеров, а также количество триллеров, в которых каждый из них появился.

Текущий запрос, который я использую:

SELECT a.fname, a.lname, COUNT(DISTINCT m.id)
   FROM Actor a, Casts c, Movie m, genre g
   WHERE a.id = c.pid
     AND c.mid = m.id
     AND c.mid = g.mid
     AND g.genre = 'Thriller'
   GROUP BY a.id, a.fname, a.lname
   HAVING COUNT(DISTINCT m.id) >= 40
   ORDER BY COUNT(DISTINCT m.id) DESC

Поскольку это домашнее задание,Я загрузил этот ответ в Gradescope.Он возвращает только результат:

Test Failed: False is not true

, что не очень полезно, и как прямой результат затрудняет поиск ошибки в моей логике.Я также не могу опубликовать дословно неправильный ответ в результате бесполезного сообщения об ошибке.Что не так с моим запросом, и что я могу изменить, чтобы он работал?

1 Ответ

0 голосов
/ 09 октября 2018

В вашем запросе нет ничего неправильного, с GradeScope должно быть что-то не так, что бы это ни было.Обратите внимание, что вам на самом деле не нужно включать a.id в ваши GROUP BY.

. Я бы предпочел более современный подход к объединениям, например, используя ключевое слово JOIN.

Fiddle Here

SELECT
      aim.fname,
      aim.lname,
      aim.movieCount
  FROM
      (
      SELECT
              a.fname,
              a.lname,
              COUNT(DISTINCT m.id) movieCount
         FROM
             actor a
           JOIN
             casts c
               ON c.pid = a.id
           JOIN
             movie m
               ON m.id = c.mid
           JOIN
             genre g
               ON g.mid = m.id
         WHERE
             g.genre = 'Thriller'
         GROUP BY
             a.fname,
             a.lname
      ) aim
  WHERE
      aim.movieCount > 39
  ORDER BY
      aim.movieCount DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...