データベースにいくつかのテーブルがあります 記録。どの位置にあるかを特定する方法を知る必要があります 最近記録が出て、ランキングシステムを作って スコアに応じた位置。
例、データベースに次のレコードがあります
user-01 / 100 points
user-02 / 88 points
user-03 / 55 points
user-04 / 11 points
user-05 / 30 points
これで、user-03がどこにあるのか知りたいのですが、これが3番目です。システムがこの配置を表示するにはどうすればよいですか?
ありがとう!
回答:
回答№1は1結果セットに行番号列を作成できます。変数を初期化するには、 JOIN
変数を0に設定するだけの疑似テーブルに変換します。 SET
事前に-追加のステートメントが必要です。
デモを行うには:
mysql> CREATE TABLE scores (user VARCHAR(10), score INT);
Query OK, 0 rows affected (0.08 sec)
mysql> INSERT INTO scores
-> VALUES ("user1", 10),
-> ("user2", 20),
-> ("user3", 30);
Query OK, 3 rows affected (0.02 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> SELECT user, score, @rownum := @rownum + 1 AS rank
-> FROM scores
-> JOIN (SELECT @rownum := 0) rownum
-> ORDER BY score DESC;
+-------+-------+------+
| user | score | rank |
+-------+-------+------+
| user3 | 30 | 1 |
| user2 | 20 | 2 |
| user1 | 10 | 3 |
+-------+-------+------+
3 rows in set (0.00 sec)
回答№2の場合は0
同様の問題が発生しましたが、この「user-03」のような行が複数回繰り返されていました。また、2つのテーブルを使用していました。
テーブルの構造:
スコアテーブル[スコアfloat、uid int、timestamp datetime] ユーザーテーブル[usernamevarchar(500)、id int、etc ...]
ランク付けの基準は、最大スコアに基づいてユーザーをリストすることでした。だから私はを使用してクエリを変更しました グループ別 そして ジョイン 以下に示すSQLクエリで。
ランキングシステム。
SELECT *, @rownum:=@rownum+1 as rank
FROM (
select MAX(s.score) as score,u.username as username
from scorelog s join userdb u on s.uid=u.id
group by s.uid
order by MAX(s.score) desc
) user_rank, (SELECT @rownum:=0) r
個々の行の位置とデータベースでのランクを特定するには、以下のクエリを使用します。 ザ・
SELECT *
FROM ( SELECT *, @rownum:=@rownum+1 as rank
FROM (
select MAX(s.score) as score,
u.username as username,
s.uid as uid,s.
timestamp as timestamp
from scorelog s join userdb u on s.uid=u.id
group by s.uid order by MAX(s.score) desc
) user_rank, (SELECT @rownum:=0) r
)t where username = "johndoe"
同様の解決策を提供するstackoverflowからの以下のリソースも参照してください。