ユーザーIDとスコアを持つmySqlにテーブルがあります。
私がやりたいことは、テーブルをスコア (単純) で整理することですが、特定のユーザー ID がテーブルのどこにあるかを見つけます。
これまでのところ、次のようになります。
SELECT * FROM table_score
ORDER BY Score DESC
どこにあるかを調べるにはどうすればよいですかuserID = '1234'
(つまり、エントリ 10/12)
UserRank
次のクエリは、ユーザーのランクを指定する新しい列を提供します。
SELECT
UserID,
Score,
(@rownum := @rownum + 1) UserRank
FROM table_score, (SELECT @rownum := 0) t
ORDER BY Score DESC;
これにより、次のような結果が得られます。
| USERID | SCORE | USERRANK |
-----------------------------
| 4 | 100 | 1 |
| 10 | 70 | 2 |
| 2 | 55 | 3 |
| 1234 | 50 | 4 |
| 1 | 36 | 5 |
| 20 | 33 | 6 |
| 8 | 25 | 7 |
次に、このクエリをサブクエリ内に配置し、 でフィルタリングして、userId
そのユーザー ランクを取得できます。何かのようなもの:
SELECT
t.UserRank
FROM
(
SELECT *, (@rownum := @rownum + 1) UserRank
FROM table_score, (SELECT @rownum := 0) t
ORDER BY Score DESC
) t
WHERE userID = '1234';
特定のユーザー ID について、単純なクエリでこれを行うことができます。
select sum(case when ts.score >= thescore.score then 1 else 0 end) as NumAbove,
count(*) as Total
from table_score ts cross join
(select ts.score from table_score ts where userId = '1234') thescore
スコアとユーザー ID にインデックスがある場合、これは非常に効率的です。