首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL使用GROUP BY对结果进行排名

MySQL使用GROUP BY对结果进行排名
EN

Stack Overflow用户
提问于 2019-02-17 04:50:10
回答 1查看 60关注 0票数 0

我有一张桌子:

代码语言:javascript
复制
id leaderboard_id player_id score
 1              1        3 5001
 2              1        2  501
 3              1        4  490
 4              2        3 1001
 5              2        2  110

我想在两个排行榜(leaderboard_id =1和2)上获得player_id =3的排名。

我尝试了许多选项,但都没有成功,它们给我在排行榜1中的排名1,在排行榜2中的排名2,而它们都应该是排名1。

给我这些结果的最后一段代码是:

代码语言:javascript
复制
SELECT * FROM ( SELECT s.*, @rank := @rank + 1 rank FROM ( SELECT leaderboard_id, player_id, score FROM leaderboards t GROUP BY leaderboard_id ) s, (SELECT @rank := 0) init ORDER BY score DESC ) r WHERE player_id = 3

..。结果如下:

如果有人能指出一个解决方案,我们将不胜感激。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2019-02-17 05:32:22

在MySql 8中,你可以使用像ROW_NUMBERDENSE_RANK这样的window functions

在MySql 7中,您可以使用变量来模拟这些窗口函数。

在您的案例中,您需要每个排行榜的排名。

所以它需要检查排行榜是否发生了变化。

子查询中的ORDER BY对该计算很重要。

示例数据:

代码语言:javascript
复制
-- Test Table
drop table if exists test_leaderboards;
create table test_leaderboards (
  id int primary key auto_increment,
  leaderboard_id int not null,
  player_id int not null,
  score int not null
);

-- Sample Data
insert into test_leaderboards (leaderboard_id, player_id, score) values
(1, 3, 3333),
(1, 2, 2222),
(1, 4, 4444),
(2, 3, 3333),
(2, 2, 2222),
(2, 1, 1111);

查询:

代码语言:javascript
复制
SELECT leaderboard_id, player_id, score, rank
FROM 
( 
  SELECT leaderboard_id, player_id, score, 
    CASE 
    WHEN leaderboard_id = @prev then @rank := @rank + 1
    -- Remark: a variable assignement is always true
    WHEN @prev := leaderboard_id then @rank := 1
    END AS rank 
  FROM 
  (
       SELECT leaderboard_id, player_id, score
       FROM test_leaderboards
       ORDER BY leaderboard_id ASC, score DESC
  ) data
  CROSS JOIN (SELECT @rank := null, @prev := null) AS init
) r 
WHERE player_id = 3;

结果:

代码语言:javascript
复制
leaderboard_id  player_id   score   rank
--------------  ---------   -----   ----
1               3           3333    2
2               3           3333    1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54727534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档