【问题标题】:How to separate the maximum count for each genre of something如何区分每种类型的最大计数
【发布时间】:2018-06-03 16:03:22
【问题描述】:

我想为每个 电影类型,找到在大多数电影中出演过的 N 个演员 类型的

我已经这样做了:

select genre.genre_name,actor.actor_id,count(genre.genre_name) 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;

它给出了每个类型的结果,每个演员播放了多少该类型的电影,现在我想为每个类型找到播放该类型电影最多的演员。

Tables and their columns:

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)

结果应该是这样的:

Action 22591 7
Horror 25863 3
Horror 24867 3
Comedy 23476 2
Drama  14536 1
Drama  19634 1
Drama  17563 1

【问题讨论】:

    标签: mysql


    【解决方案1】:

    伙计,接下来我要做的是(假设您的代码运行良好):

    -- Notice this is your code with some aliases, nothing else.
    -- Just for making mi job easier.
    create view frequency as
    select genre.genre_name as genre_ name, 
           actor.actor_id as actor_id,
           count(genre.genre_name) as freq
    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;
    
    -- And this is my proposal
    -- Take the max frequency per each category
    -- and find the guy who possesses it (maybe 2 or more...)
    select genre.genre_name,actor.actor_id
    from frequency as tbl1 inner join
    (
      -- The max frequency in a genre.
      select f.genre_name,
             max(f.freq) as max_freq
      from frequency f
      group by(genre_name)
    ) as tbl2 on (tbl1.genre_name = tbl2.genre_name)
    where tbl1.freq = tbl2.max_freq;
    

    还有一个问题:如果出现平局,每个类别可能会返回一个以上的演员。但是我怎么知道谁是赢家呢?我让给你。也许是错的,我不这么认为,但我们都在学习!希望能帮到你。

    【讨论】:

      【解决方案2】:

      您需要使用MAX() 函数。一些 SQL 实现(例如 Oracle)允许您这样做:SELECT MAX(COUNT(whatever)) 但 MySQL 不是其中之一。

      一种做你想做的事的方法是这样的:

      select genre_name, actor_id, max(genrecount)
      from (
          select genre.genre_name, actor.actor_id, count(genre.genre_name) as genrecount
          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
          group by genre.genre_name,actor.actor_id
      ) as topactor
      

      这对从内部SELECT派生的表上的外部SELECT进行。

      【讨论】:

      • 它无法识别外部选择上的genre.genre_name,actor.actor_id
      • @stef 我的错误,对不起。当我从您的原始表格中复制它时,我忘记删除对实际表格的引用,您必须这样做,因为您指的是内部选择的结果。 (你也可以说topactor.genre_name 等。)我已经编辑了我的答案。
      猜你喜欢
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多