MySQL行选择仅在结果不相同时递增

时间:2013-06-21 16:45:04

标签: jquery mysql sql database

我正在尝试从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)并不是理想的方法。那么,只有当点数不同时,我才能进行具体的递增?

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;

非常感谢你带领我走向正确的方向乔治!