Проблемы с групповым максимумом определенного столбца

0

Я хочу найти для каждого жанра фильма, найти N актеров, которые играли в большинстве фильмов жанра

Таблицы и их столбцы:

actor(actor_id,name)
role(actor_id,movie_id)
movie(movie_id,title)
movie_has_genre(movie_id,genre_id)
genre(genre_id,genre_name)

Я начал делать это:

select genre.genre_name,actor.actor_id,count(genre.genre_name) as max_value from genre
inner join movie_has_genre on movie_has_genre.genre_id=genre.genre_id
inner join movie on movie_has_genre.movie_id=movie.movie_id
inner join role on movie.movie_id=role.movie_id
inner join actor on actor.actor_id=role.actor_id
group by genre.genre_name,actor.actor_id 
order by max_value desc;

который дает мне для каждого жанра фильмов, актеров и сколько фильмов этого жанра они сыграли, и я хочу найти актера, который сыграл больше всего фильмов каждого жанра, поэтому я пробовал это:

 select genre.genre_name,actor.actor_id,count(genre.genre_name) 
from(select genre.genre_name,actor.actor_id,count(genre.genre_name) as max_value from genre
inner join movie_has_genre on movie_has_genre.genre_id=genre.genre_id
inner join movie on movie_has_genre.movie_id=movie.movie_id
inner join role on movie.movie_id=role.movie_id
inner join actor on actor.actor_id=role.actor_id
group by genre.genre_name,actor.actor_id 
order by max_value desc) as apotelesmata
group by genre.genre_name;

и я получаю как ошибку из workbench mysql, что он не распознает почти все, что у меня есть на моей внешней функции select. Мой вопрос - что мне делать, чтобы получить правильные результаты. С первым кодом, который я дал, я получил следующее:

Thriller    22591   7
Drama   22591   6
Crime   65536   3
Horror  22591   3
Thriller    812916  3
Action  292028  3
Action  378578  3
Thriller    292028  3
Thriller    378578  3

Но я хочу это сделать:

Thriller    22591   7
Drama   22591   6
Crime   65536   3
Horror  22591   3
Action  292028  3
Action  378578  3
Теги:
mysql-workbench

1 ответ

1
Лучший ответ

Один вариант, довольно уродливый:

SELECT t1.genre_name, t1.actor_id, t1.max_value
FROM
(
    SELECT g.genre_name, a.actor_id, COUNT(*) AS max_value
    FROM genre g
    INNER JOIN movie_has_genre mhg ON mhg.genre_id = g.genre_id
    INNER JOIN movie m ON mhg.movie_id = m.movie_id
    INNER JOIN role r ON m.movie_id = r.movie_id
    INNER JOIN actor a ON a.actor_id = r.actor_id
    GROUP BY g.genre_name, a.actor_id
) t1
INNER JOIN
(
    SELECT genre_name, MAX(max_value) AS max_value
    FROM
    (
        SELECT g.genre_name, a.actor_id, COUNT(*) AS max_value
        FROM genre g
        INNER JOIN movie_has_genre mhg ON mhg.genre_id = g.genre_id
        INNER JOIN movie m ON mhg.movie_id = m.movie_id
        INNER JOIN role r ON m.movie_id = r.movie_id
        INNER JOIN actor a ON a.actor_id = r.actor_id
        GROUP BY g.genre_name, a.actor_id
    ) t
    GROUP BY genre_name
) t2
    ON t1.genre_name = t2.genre_name and t1.max_value = t2.max_value
ORDER BY
    t1.max_value DESC;

Многословие этого ответа связано с тем, что базовая таблица для вашего вопроса на самом деле представляет собой запрос, который уже включает 4 объединения. Эта таблица должна повторяться в MySQL, потому что у нас нет аналитических функций. Кроме того, у нас нет общих табличных выражений, которые также могут сделать запрос более кратким.

  • 0
    в начале он сказал, что это была неоднозначная причина первой функции выбора. Исправил это. Тогда угадайте, что ... та же ошибка: P
  • 0
    я попробовал твою отредактированную версию, и я думаю, что это работает
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню