假设我们有这些表格:
流派:
genre_id genre_name
1 comedy
2 horror
3 action
演员:
actor_name genre_id
stef 2
panos 2
bill 2
panos 2
bill 3
stef 3
panos 3
bill 3
stef 1
stef 1
我想找到每种类型的演员,他们在这类电影的大部分电影中都有过播放(电影专栏需要这就是为什么它不存在)。
我想要的结果是:
comedy stef 2
horror panos 2
action bill 2
答案 0 :(得分:2)
尝试此查询:
select genre_name, actor_name, cnt from (
select actor_name,
genre_name,
cnt,
row_number() over (partition by genre_name order by cnt desc) `rn`
from (
select actor_name, genre_name, count(*) `cnt` from actors `a`
join genres `g` on a.genre_id = g.genre_id
group by actor_name, genre_name
) `a`
) `a` where rn = 1;
注意强>
以上uery使用在MySQL 8.0中引入的窗口函数,因此如果您使用的是早期版本,则此查询将导致错误。
答案 1 :(得分:0)
这是SqlFiddle在MySql中实现Group-wise Maximum of a Certain Column的算法。
select aActors.genre_id, aActors.actor_name, aActors.aCount as movies_count
from (
select count(*) as aCount, actor_name, genre_id
from actors
group by actor_name, genre_id
order by aCount desc
) as aActors
left join (
select count(*) as aCount, actor_name, genre_id
from actors
group by actor_name, genre_id
order by aCount desc
) as bActors
on aActors.genre_id = bActors.genre_id
and aActors.aCount < bActors.aCount
where bActors.genre_id IS NULL;