在MYSQL排名结果

时间:2016-05-29 04:38:05

标签: mysql select rank

我有一个MYSQL表,看起来像这样:

ID | NAME CODE | SCORE
1: A01: 1
2: A01: 4
3: A01: 5
4: A02: 2
5: A02: 3
6: A02: 3
7: A02: 7

我正在寻找的排名结果是这个(考虑到2个不同的NameCode组):

ID | NAME CODE | SCORE | RANK

1: A01: 1: 1
2: A01: 4: 2
3: A01: 5: 3
4: A02: 2: 1
5: A02: 3: 2
6: A02: 3: 2
7: A02: 7: 4

我可以使用以下代码对分数进行排名:

SELECT
  my_table.id,
  my_table.NameCode,
  my_table.Score,
  @prev := @curr,
  @curr := Score,
  @rank := IF(@prev = @curr, @rank, @rank + @i) AS rank,
  IF(@prev <> Score, @i:=1, @i:=@i+1) AS counter
FROM
 my_table,
  (SELECT @curr := null, @prev := null, @rank := 1, @i := 0  
  ) tmp_tbl 

ORDER BY      my_table.Score ASC

但是,这并不根据每个NameCode组排名。它给出了以下结果:

ID | NAME CODE | SCORE | RANK

1: A01: 1: 1
2: A01: 4: 5
3: A01: 5: 6
4: A02: 2: 2
5: A02: 3: 3
6: A02: 3: 3
7: A02: 7: 7

有没有人知道我在每个NameCode组中排名的最有效方式?感谢。

1 个答案:

答案 0 :(得分:2)

基本上你希望你的逻辑说明它们是否是相同的重复等级,如果名称相同然后增加等级或者将其重置为1

SELECT 
    id, 
    name, 
    score,
    @rank := if(
        @name = name and @score = score, 
        @rank, 
        if(@name = name, @rank + 1, 1)
    ),
    @name := name, @score:= score
FROM your_table
CROSS JOIN (SELECT @rank := 1, @name := '', @score := 0) t;

FIDDLE

编辑:如果您需要排序的数据,请执行此操作

SELECT 
    id, 
    name, 
    score,
    @rank := if(
        @name = name and @score = score, 
        @rank, 
        if(@name = name, @rank + 1, 1)
    ),
    @name := name, @score:= score
FROM (
    SELECT * FROM your_table
    ORDER BY name, score
) tt
CROSS JOIN (SELECT @rank := 1, @name := '', @score := 0) t;

ORDERED FIDDLE

EDIT2:如果你想按照位置排名第一名第二名。你可以这样做。

SELECT 
    id, 
    name, 
    score,
    @rank := if(
        @name = name and @score = score, 
        @rank, 
        if(@name = name, @count + 1, 1)
    ),
    @count := @count + 1,
    if(@name != name, @count := 1, @count),
    @name := name, @score:= score
FROM test
CROSS JOIN (SELECT @rank := 1, @count := 1, @name := '', @score := 0) t;

<强> RANKED FIDDLE