需要一些帮助来整理此查询。我使用的是Mysql
我有两张 table
视频 - 包含用户上传的视频
- video_id
- 用户 ID
- category_id
投票 - 包含任何用户对特定视频的投票
- vote_id
- video_id
- 用户 ID
我不想对查询中的类别进行硬编码 - 类别存储在具有category_id 和category_name 的类别表中
我基本上想要一个查询来提取每个类别的前 3 个视频(获得最多票数的视频)。
示例数据 - 视频表
video_id | user_id | category_id 1 100 10 2 101 10 3 102 11 4 103 11 5 104 11 6 105 11 7 105 12
示例数据 - 投票表
vote_id | video_id | user_id 11 3 105 12 3 102 13 3 111 14 3 121 15 4 200 16 4 201 17 1 222
示例数据 - 类别表
category_id | category_name 10 HipHop 11 Rap 12 Country
最佳答案
这种问题用排名函数来解决是微不足道的。然而,由于 MySQL 还不支持它们,这使得它变得更加困难。在此设计中,我假设 video_id
是视频表的主键。
Select video_id, user_id, category_id, vote_count, vote_rank
From (
Select VoteCounts.video_id, VoteCounts.user_id
, VoteCounts.category_id, VoteCounts.vote_count
, (
Select Count(*) + 1
From (
Select V1.video_id, V1.user_id, V1.category_id
, Count(vote_id) As vote_count
From Videos As V1
Left Join Votes As V2
On V2.video_id = V1.video_id
Group By V1.video_id, V1.user_id, V1.category_id
) As VoteCounts1
Where VoteCounts1.category_id = VoteCounts.category_id
And (
VoteCounts1.vote_count > VoteCounts.vote_count
Or (VoteCounts1.vote_count = VoteCounts.vote_count
And VoteCounts1.video_id < VoteCounts.video_id )
)
) As vote_rank
From (
Select V1.video_id, V1.user_id, V1.category_id
, Count(vote_id) As vote_count
From Videos As V1
Left Join Votes As V2
On V2.video_id = V1.video_id
Group By V1.video_id, V1.user_id, V1.category_id
) As VoteCounts
) As VoteRanks
Where VoteRanks.vote_rank <= 3
关于SQL查询提取每个类别中得票最多的前3条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4228600/