我正在尝试从SQL选择中对点进行排名,但是只有在点与返回结果中的其他点没有关联时才会对点进行排名。
我正在使用的SQL查询:
SET @rank=0;
SELECT *, @rank:=@rank+1 AS rank FROM points;
非常简单! 它显示以下结果:
id | user_id | points | rank
----------------------------
2 | 133845 | 220 | 1
3 | 134084 | 220 | 2
4 | 1 | 150 | 3
5 | 134086 | 145 | 4
6 | 134080 | 100 | 5
7 | 17938 | 30 | 6
8 | 83011 | 20 | 7
9 | 26 | 5 | 8
10 | 134077 | 5 | 9
11 | 134074 | 5 | 10
正如你所看到的,ID 2和3具有相同的分数,ID 9,10和11也是如此。从技术上讲,所有这些分数应该相同,而不是继续增加。
下面的示例是表格的正确外观:
id | user_id | points | rank
----------------------------
2 | 133845 | 220 | 1
3 | 134084 | 220 | 1
4 | 1 | 150 | 2
5 | 134086 | 145 | 3
6 | 134080 | 100 | 4
7 | 17938 | 30 | 5
8 | 83011 | 20 | 7
9 | 26 | 5 | 8
10 | 134077 | 5 | 8
11 | 134074 | 5 | 8
我意识到在选择中每行不断递增排名(使用@ rank + 1)并不是理想的方法。那么,只有当点数不同时,我才能进行具体的递增?
答案 0 :(得分:1)
因此工作解决方案最终成为:
SET @rank=0;
SET @curr=0;
SELECT *,
@prev := @curr,
@curr := points.points,
@rank := IF(@prev = @curr, @rank, @rank+1) AS rank
FROM points;
非常感谢你带领我走向正确的方向乔治!