9

この問題に関する多くのトピックを読みましたが、解決策が見つかりません。

Web サイトのユーザーを含むテーブル (users と呼ばれる) があります。ポイントがあります。例えば:

+-----------+------------+
| User_id   | Points     |
+-----------+------------+
| 1         | 12258      |
| 2         | 112        |
| 3         | 9678       |
| 4         | 689206     |
| 5         | 1868       |
+-----------+------------+

ページの上部に、変数 $user_id が設定されています。たとえば、user_id は 4 です。ここで、ユーザーのランクをポイントで取得したいと思います (user_id が 4 の場合、出力は 1 になるはずです)。

どうもありがとうございました!

4

5 に答える 5

15
SELECT 
    COUNT(*) AS rank 
FROM users 
WHERE Points>=(SELECT Points FROM users WHERE User_id=4)

いくつかのより便利なもので更新されました:

SELECT 
    user_id, 
    points, 
    (SELECT COUNT(*)+1 FROM users WHERE Points>x.points) AS rank_upper, 
    (SELECT COUNT(*) FROM users WHERE Points>=x.points) AS rank_lower 
FROM 
    `users` x 
WHERE x.user_id = 4

これには、ユーザーがいるランクの範囲が含まれます。たとえば、上位 5 位のスコアが 5 4 3 3 3 の場合、結果は次のようになります。

id points rank_upper rank_lower
id 5      1          1
id 4      2          2
id 3      3          5
id 3      3          5
id 3      3          5
于 2012-04-28T12:20:40.253 に答える
1

このクエリは、あなたが望むことをするはずです:

SELECT rank FROM (
   SELECT User_id, Points,
          FIND_IN_SET(
                Points,
                   (SELECT  GROUP_CONCAT(
                           DISTINCT Points 
                            ORDER BY Points   DESC
                        )
               FROM    users)
            ) as rank
    FROM   users )
WHERE User_id = 4;
于 2012-04-28T12:20:01.003 に答える
0

これは役立つかもしれません

SELECT @rank:=@rank+1 AS rank,`User_id`,`Points` FROM `users` u JOIN (SELECT @rank:=0) r ORDER BY u.Points DESC
于 2013-10-09T12:13:56.887 に答える
0

mysql の外部で実行したくない場合は、変数を使用してランクを計算する必要があります。

これは、あなたが望むものを正確に説明するソリューションです:

http://www.fromdual.ch/ranking-mysql-results

レコードごとに直接取得し、レコードに保存して自分で更新する必要がある場合は、まだ必要です。実際のテーブルに格納せずにランクを直接提供する合理的なクエリはありません (つまり、数百のレコードだけではありません)。

于 2012-04-28T12:17:03.173 に答える
0

あなたの目的にぴったりの簡単な解決策がすでにあります。

于 2012-04-28T12:20:55.263 に答える