【问题标题】:mysql rank by column value grouped by column valuemysql 按列值排序,按列值分组
【发布时间】:2014-07-24 07:11:50
【问题描述】:

我试图弄清楚如何根据 laravel 中的 2 个不同的列号进行排名,但原始的 mysql 可以。我有一个视频列表,这些视频在比赛中,如果有人喜欢该视频,就会获得投票。每个视频都会有一个投票号码和一个比赛号码。我正在尝试根据比赛中的投票进行排名。因此,例如下面我有比赛 8,我需要根据投票获得该比赛中所有视频的排名。然后我需要相同的比赛 5 等。

  |rank|votes|competition|
  ------------------
  |  1 | 100 | 8   |
  ------------------
  |  2 |  50 | 8   |
  ------------------
  |  3 |  30 | 5   |
  ------------------
  |  1 | 900 | 5   |
  ------------------
  |  2 |  35 | 5   |
  ------------------

我尝试了各种 group 和 selectby 方法,但似乎没有任何效果,有什么想法吗?

【问题讨论】:

  • 所以我猜你的表中没有排名列?并且您需要查询权中的排名
  • 正确,即使我确实有一个排名列,我仍然需要一个查询来计算这个。

标签: php mysql sql laravel eloquent


【解决方案1】:

在 Mysql 中,您可以使用用户定义的变量来计算排名,case 语句检查竞争是否与前一行相同,如果不同,则将排名加一,然后分配 1 一个 order by 才能获得正确的视频排名

 SELECT t.*,
   @current_rank:= CASE WHEN @current_rank = competition 
             THEN  @video_rank:=@video_rank +1 
             ELSE @video_rank:=1 END  video_rank,
   @current_rank:=competition
FROM t ,
(SELECT @video_rank:=0,@current_rank:=0) r   
  ORDER BY competition desc, votes desc

See Demo

如果您对最后一个额外的列感到困惑,您可以使用子选择

See Demo

【讨论】:

  • 啊!它工作得很好!你我的朋友是个巫师。
【解决方案2】:

您可以使用窗口函数:

select
    competition, votes, rank() over (partition by competition order by votes desc) as rank
from
    table1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 2017-01-06
    • 1970-01-01
    • 2019-01-13
    相关资源
    最近更新 更多