Mysql 对某列的分组最大值有问题

Mysql 对某列的分组最大值有问题,mysql,mysql-workbench,Mysql,Mysql Workbench,我想找到每种类型的电影,找到在该类型的大多数电影中扮演过的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_va

我想找到每种类型的电影,找到在该类型的大多数电影中扮演过的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;
我从mysql workbench得到一个错误,它不能识别我在外部选择函数上的几乎所有内容。我的问题是,我应该怎么做 得到正确的结果。 通过我给出的第一个代码,我得到:

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
但我想得到这个:

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

一个选择,相当丑陋:

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中重复,因为我们没有分析函数。而且,我们没有通用的表表达式,这也可以使查询更加简洁。

开始时,它说第一个选择函数的原因不明确。修复了它。然后猜猜是什么…相同的错误:Pno错误和结果似乎是我想要的。非常感谢。有人说我想限制,比如说每种类型5个,我应该在哪里放置限制函数?@stef你不容易做到这是在MySQL中实现的。您需要使用会话变量,结果查询可能比我发布的还要长。如果您有这些长期需求,那么要么升级到MySQL 8,要么切换到另一个DB。