如何获取MySQL中按字段分组的最大计数?

时间:2020-04-15 16:05:20

标签: mysql group-by

给出此表,其中包含商店出售的电影的列表:

store_id | film_id
---------|--------
1        | 123
1        | 32
2        | 145
1        | 123
2        | 84
2        | 456
1        | 6
2        | 456

我如何才能按商店获得销量最高的电影(= film_id分组的表格中最常出现的store_id)?我的猜测是max() count(movie_id),但我不知道如何进行这项工作。

我正在尝试获得这种结果:

store_id | mostSoldMovieId
---------|--------
1        | 123
2        | 456

1 个答案:

答案 0 :(得分:1)

如果您的MySql版本为8.0+,则可以使用RANK()窗口函数:

select t.store_id, t.film_id mostSoldMovieId
from (
  select store_id, film_id,
    rank() over (partition by store_id order by count(*) desc) rn
  from tablename
  group by store_id, film_id
) t
where t.rn = 1

如果在同一家商店平均卖出两部电影,这将恢复联系。
请参见demo
对于以前的MySql版本,您可以执行以下操作:

select 
  t.store_id,
  substring_index(group_concat(t.film_id order by counter desc), ',', 1) film_id
from (
  select store_id, film_id, count(*) counter
  from tablename
  group by store_id, film_id
) t  
group by t.store_id

这不会恢复联系。
请参见demo
结果:

| store_id | film_id |
| -------- | ------- |
| 1        | 123     |
| 2        | 456     |