2017-10-06 12 views
0

私はランク付けシステムを持っています。これはポイントに基づく結果です。MySQLのランク付けシステムのカスタムクエリ

User | Points 
    1 | 100 
    2 | 197 
    3 | 123 
    4 | 174 
    5 | 98 
    ... 
    197 | 21 
    198 | 110 
    199 | 154 

私のユーザIDが197であると仮定すると、その最初の私は自分のランクがベースまたはポイントは、最高点は、最初は、最低の最後では、ので、ここで想定するかを知りたいというのが私のランク(ユーザID = 197) #150

私のランクを取得した後(自分のランクがトップ100リストにない場合)、100人のユーザーのリストを取得したいところで、1位から50位のユーザー+ 125位から175位のユーザーを取得する必要があります私はこのリストで自分のランクを取得することもできますが、リストランクの結果は実際のランクになります

User | Points | Rank 
18 | 199 | 1 
22 | 198 | 2 
31 | 180 | 3 
19 | 174 | 4 
51 | 168 | 5 
+ 
17 | 22 | 149 
197 | 21 | 150 
199 | 14 | 151 

私はアプリを持っていますPHPでは、この結果セットを達成するための最良かつ効率的な方法は何ですか?

彼らのランクのスコアを返すための全体的なクエリは次のようになります(または、私はそれが動作しますが、最もエレガントな解決策ではないかもしれないとして、「かもしれない」と言うべきです)
+5

私たちはいつも新しいコーディング担当者をサポートしてくれることをうれしく思いますが、まずは自分自身を助ける必要があります。 : - )***あなたが問題を抱えている場合は** [**もっと研究をしています**](https://meta.stackoverflow.com/q/261592/1011527)**あなたが試したことを投稿してください** **動作していないことの明確な説明**を提供し、[最小、完全、および検証可能な例](http://stackoverflow.com/help/mcve)を提供します。 [質問する](http://stackoverflow.com/help/how-to-ask)の良い質問をお読みください。 [ツアーに参加する](http://stackoverflow.com/tour)と[this](https://meta.stackoverflow.com/q/347937/1011527)を必ず読んでください。 –

答えて

1

SET @count = 0; 
SELECT 
    user, 
    points, 
    rank 
    FROM( 
     SELECT user, 
       points, 
        @count := @count + 1 'rank' 
     FROM scores 
     ORDER BY points DESC 
    ) as ranks; 

だからあなたがしたい場合あなたが、最後にwhere句を追加したい、特定のユーザのランクを知っている:それは、特にフォーマットで、第二部に来るとき

WHERE user = 197; 

、私はPHPで行わ最高だと思います。あなたの「ランク」を取得する上では、このような何か実行することができます(注:私はちょうど擬似答えをここにPHPを引用ではなく、スクリプトだ):最初の50件の結果を得るために

$myRank = [result of above query]; 

if($myRank > 100) { 

// retrieve first 50 results and display in query 1 

echo "..."; // or in a <td>, etc. 

// retrieve results x to y and display in query2, loop through a table etc. 

} 
else { 

// retrieve the first 100 if your score is in that range 

} 

SQL

SET @count = 0; 
SELECT 
    user, 
    points, 
    rank 
    FROM( 
     SELECT user, 
       points, 
        @count := @count + 1 'rank' 
     FROM scores 
     ORDER BY points DESC 
    ) as ranks 
    LIMIT 0,50; 

になり、その後、あなたは次の結果セットを取得するために、PHPで私たちの理論$myRankの出力を使用する必要があると思います。

上部のPHPで、だろう
LIMIT $myRank,$upper; 

$upper = $myRank+50; 

あなたは明らかに必要があると思いますが、あなたのランクの後に次の50を望んでいた場合たとえば、あなたはへの最後の行を変更したいです実際に完全なソリューションを結びつける前に、さまざまなシナリオで達成したいことを正確に把握してください。しかし、うまくいけば、これはいくつかの助けになります。

関連する問題