2

SQL select からポイントをランク付けしようとしていますが、返された結果でポイントが他のポイントと結び付けられていない場合に限ります。

私が使用している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 を使用して) ランクを継続的にインクリメントすることは、これを行うための理想的な方法ではないことを認識しています。では、ポイントが異なる場合にのみ具体的にインクリメントするにはどうすればよいでしょうか?

4

1 に答える 1

1

したがって、実用的なソリューションは次のようになります。

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

ジョージ、正しい方向に導いてくれてありがとう!

于 2013-06-21T19:23:29.243 に答える