1. ホーム
  2. mysql

[解決済み] MySQLで、テーブルのレコードインデックスを含むカラムを生成するにはどうすればよいですか?

2022-12-01 21:18:39

質問

クエリから実際の行番号を取得する方法はありますか?

リーグガールというテーブルをスコアというフィールドで並べ替え、ユーザー名とそのユーザー名の実際の行の位置を返せるようにしたいのです。

私は、特定のユーザーがどこにいるかわかるように、ユーザーに順位をつけたいと思っています。たとえば、Joe は 200 のうち 100 の位置です。

User Score Row
Joe  100    1
Bob  50     2
Bill 10     3

ここでいくつかの解決策を見ましたが、私はそれらのほとんどを試しましたが、どれも実際に行番号を返しませんでした。

私はこれを試しました。

SELECT position, username, score
FROM (SELECT @row := @row + 1 AS position, username, score 
       FROM league_girl GROUP BY username ORDER BY score DESC) 

由来通り

...ですが、行の位置は返さないようです。

何かいい方法はないでしょうか?

どのように解決するのですか?

以下のことを試してみてください。

SELECT  l.position, 
        l.username, 
        l.score,
        @curRow := @curRow + 1 AS row_number
FROM    league_girl l
JOIN    (SELECT @curRow := 0) r;

JOIN (SELECT @curRow := 0) の部分は、変数の初期化を、別の SET コマンドを使わなくても変数の初期化ができるようになります。

テストケースです。

CREATE TABLE league_girl (position int, username varchar(10), score int);
INSERT INTO league_girl VALUES (1, 'a', 10);
INSERT INTO league_girl VALUES (2, 'b', 25);
INSERT INTO league_girl VALUES (3, 'c', 75);
INSERT INTO league_girl VALUES (4, 'd', 25);
INSERT INTO league_girl VALUES (5, 'e', 55);
INSERT INTO league_girl VALUES (6, 'f', 80);
INSERT INTO league_girl VALUES (7, 'g', 15);

テストクエリです。

SELECT  l.position, 
        l.username, 
        l.score,
        @curRow := @curRow + 1 AS row_number
FROM    league_girl l
JOIN    (SELECT @curRow := 0) r
WHERE   l.score > 50;

結果

+----------+----------+-------+------------+
| position | username | score | row_number |
+----------+----------+-------+------------+
|        3 | c        |    75 |          1 |
|        5 | e        |    55 |          2 |
|        6 | f        |    80 |          3 |
+----------+----------+-------+------------+
3 rows in set (0.00 sec)