Я не знаю о MySQL, но вот как я бы попытался сделать это в SQL Server, и, возможно, внес некоторые коррективы в зависимости от результатов, которые имеют смысл.
select Category
, Film
, MAX(Votes) as Votes
from (
select TOP 3 c.category_name as Category
, vd.video_id as Film
, COUNT(vt.votes) as Votes
from Category c
inner join Video vd on vd.category_id = c.category_id
inner join Votes vt on vt.video_id = vd.video_id
where c.category_id = 10 -- HipHop
group by c.category_name
, vd.video_id
union
select TOP 3 c.category_name
, vd.video_id
, COUNT(vt.votes) as Votes
from Category c
inner join Video vd on vd.category_id = c.category_id
inner join Votes vt on vt.video_id = vd.video_id
where c.category_id = 11 -- Rap
group by c.category_name
, vd.video_id
-- You need as much UNION as there are categories.
) Top3VotesPerCategory
group by Category
, Film
В зависимости от того, принимаете ли вы отрицательные голоса по фильму, можно зарегистрировать отрицательный голос по фильму, и это не значит, что он рекомендует это видео. Если вы поддерживаете такую функциональную функцию, то вы можете рассмотреть условное SUM()
вместо COUNT()
для количества голосов, чтобы учитывались отрицательные голоса и уменьшались бы его общие баллы в отношении голосов. .