【问题标题】:MySQL row select increments only when results aren't the same [duplicate]MySQL 行选择仅在结果不同时才会增加 [重复]
【发布时间】:2013-06-21 16:45:04
【问题描述】:

我正在尝试对 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

我意识到在 select 上每行不断增加排名(使用@rank+1)并不是理想的方法。那么我将如何仅在点不同时才进行具体递增呢?

【问题讨论】:

  • 来自this answer: @rank := IF(@prev = @curr, @rank, @rank+1) AS rank

标签: jquery mysql sql database


【解决方案1】:

所以工作解决方案最终是:

SET @rank=0;
SET @curr=0;
SELECT *, 
  @prev := @curr,
  @curr := points.points,
  @rank := IF(@prev = @curr, @rank, @rank+1) AS rank
FROM points;

非常感谢乔治引导我走向正确的方向!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-28
    • 2011-03-05
    • 2013-03-10
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    相关资源
    最近更新 更多