Как выполнить несколько задач в одном запросе SQL - PullRequest
0 голосов
/ 07 октября 2018

Мне дали базу данных ниже:

movie(movie_id, movie_name, production_year, votes, ranking, rating)

movie_info(movie_id, movie_genre_id, note)

movie_genre(movie_genre_id, genre_name)

person(person_id, person_name, gender)

role(person_id, movie_id, role_name, role_type_id)

role_type(role_type_id, type_name)

Меня попросили отобразить в списке имена 7 лучших режиссеров, по крайней мере, 3 фильма, количество фильмов, в которых они находятся, и среднее значение.рейтинг своих фильмов, отсортированный по среднему рейтингу.С помощью приведенного ниже запроса мне удалось узнать имя режиссеров, количество фильмов, в которых они находятся, и средний рейтинг, но у меня возникли проблемы с его ограничением до топ-7 и сортировкой их по среднему рейтингу.Я пытался использовать LIMIT и ORDER BY, но я получаю синтаксические ошибки.

SELECT
  person_name, COUNT(role.movie_id), AVG(rating)
FROM
  movie
INNER JOIN
  role
  ON role.movie_id = movie.movie_id
INNER JOIN
  person
  ON role.person_id = person.person_id
INNER JOIN
  role_type
  ON role.role_type_id = role_type.role_type_id
WHERE 
type_name = 'director'
GROUP BY
    person_name
HAVING
  COUNT(role.movie_id) > 2;

Я могу даже заказать по количеству фильмов, которые они сделали, и ограничить его до 7 лучших, но для Бога я не могу заказатьэто по AVG (рейтинг)

person_name    COUNT(role.movie_id) AVG(rating)
Hitchcock, Alfred   9               8.2888890372382
Kubrick, Stanley    8               8.2999999523163
Wilder, Billy       6               8.3000000317891
Spielberg, Steven   6               8.4000000953674
Scorsese, Martin    6               8.3166666030884
Nolan, Christopher  6               8.5333331425985
Tarantino, Quentin  6               8.3666666348775

1 Ответ

0 голосов
/ 07 октября 2018
  • В MySQL псевдонимы, определенные в предложениях Select , могут использоваться в предложениях Group By, Order By и Having.
  • Использование Order by .. DESC для сортировки набора результатов по убыванию и Limit 7 для получения только 7 строк.
  • Вы должны использовать правильное Псевдоним в многостоловых запросах, чтобы избежать неоднозначного и непреднамеренного поведения.
  • Вам также необходимо использовать Group By для person_id, так как могут быть случаи, когда директора имеют одно и то же имя.
  • Если у вас есть повторяющиеся записи в таблице role, вынужно будет использовать Count(Distinct ...), чтобы избежать подсчета повторяющихся строк.

Попробуйте выполнить следующий запрос:

SELECT 
  p.person_id,  
  p.person_name, 
  COUNT(r.movie_id) AS movies_count, 
  AVG(m.rating) AS average_rating 
FROM
  movie AS m 
INNER JOIN
  role AS r 
    ON r.movie_id = m.movie_id
INNER JOIN
  person AS p 
    ON r.person_id = p.person_id
INNER JOIN
  role_type AS rt 
    ON r.role_type_id = rt.role_type_id
WHERE 
 rt.type_name = 'director'
GROUP BY 
    p.person_id, 
    p.person_name
HAVING
  movies_count > 2 
ORDER BY 
  movies_count DESC, 
  average_rating DESC 
LIMIT 7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...