0

registrationsユーザーの情報、leaderboardユーザーのIDと現在のレベル、そして最後にユーザーが特定のレベルをクリアした時間を記録する「clear_times」を含む3つのテーブルがあります。

MySQL を使用してリーダーボードを生成しています。最高レベルのユーザーが上に立ちます。clear_time同じレベルのユーザーは、レベルをクリアした時間に応じてランク付けされます。(最初にレベルをクリアすると先にランクされます)。

以下は、私が目的のために使用しているコードです:

SELECT t1.level, t3.user_id, t3.user_id2, t3.user_type
FROM leaderboard AS t1
INNER JOIN clear_times AS t2 ON ( t1.uid = t2.uid AND (t1.level -1) = t2.level ) 
INNER JOIN registrations AS t3 ON ( t1.uid = t3.id ) 
ORDER BY t1.level DESC , t2.clear_time ASC

id' is a primary key of anduid` は外部キーです。

このコードは、リーダーボードの生成に最適です。今、特定のユーザーのランクを特定したいと思いますid。これは、レコードをループし、カウンター変数を使用して、サーバー側のスクリプトで実行できます。しかし、MySQL自体でこれを行う方法があり、上記のコードを操作する方法があると思いますが、私にはできませんでした。

4

1 に答える 1

1

ターゲット ユーザーのlevelclear_timeが分かれば、指定された順序で上位にランク付けされたレコードの数を数えるだけです。

SELECT COUNT(*)
FROM   leaderboard   AS t1
  JOIN clear_times   AS t2 ON t1.uid = t2.uid AND t1.level = t2.level + 1
  JOIN registrations AS t3 ON t1.uid = t3.id
WHERE  t1.level > ? OR (t1.level = ? AND t2.clear_time < ?)

必要に応じて、さらに結合またはサブクエリを使用して、同じクエリ内のターゲット ユーザーに関する欠落情報を取得できます。それは読者の練習問題として残しておきます。

于 2013-10-29T18:49:20.993 に答える