我有一个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组中排名的最有效方式?感谢。
答案 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;
编辑:如果您需要排序的数据,请执行此操作
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;
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 强>