MySQL用GROUP BY对结果进行排名

时间:2019-02-16 20:50:10

标签: mysql

我有这张桌子:

import caffe

net = caffe.Net('simple.prototxt', caffe.TEST)
net.params['conv1'][0].data[...] = w.reshape(96, 3, 11, 11)  # set weights 1
net.params['conv1'][1].data[...] = b  # set weights 2 (bias)
net.blobs['inp'].reshape(1, 3, 500, 500) # reshape input layer to fit our input array x
print(net.forward(inp=x.reshape(1, 3, 500, 500)).get('conv1'))

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

我尝试了许多选项,但均未成功,它们使我在排行榜1中排名1,在排行榜2中排名2,而这两个选项均应排在第一。

给出这些结果的最后代码是:

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

...结果如下:

enter image description here

如果任何人都可以指出一个解决方案,将不胜感激。

谢谢

1 个答案:

答案 0 :(得分:0)

在MySql 8中,您可以像这样使用window functionsROW_NUMBER之类的DENSE_RANK

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

在您的情况下,您需要每个排行榜的排名。
因此,需要检查排行榜是否已更改。
子查询中的ORDER BY对于该计算确实很重要。

样本数据:

-- 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);

查询:

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;

结果:

leaderboard_id  player_id   score   rank
--------------  ---------   -----   ----
1               3           3333    2
2               3           3333    1