SQL查询提取每个类别中得票最多的前3条记录

标签 sql mysql greatest-n-per-group

需要一些帮助来整理此查询。我使用的是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/

相关文章:

mysql - 使用现有表中的序列号自动排列 GROUPBY 中的数据

SQL Server - 选择所有顶部的小时记录

MySQL:计数然后按计数总数排序

php - 减少数据库 PHP MySQL 显示的图像数量

postgresql - 使用 "SELECT DISTINCT"时如何保留额外的 key ?

sql - 如何将数组添加到 SQL (Postgres) 中的数组数组

sql - 在SQL中将两个计数结果相互划分

php - 从数据库中选择所有行,但某些行包含定义的字符串

mysql - 检索过去 7 天当天的最后一条记录

php - Mysql 子查询失败,需要帮助 :)