0

私はランキングテーブルを持っており、そこにはすべてのプレイヤーがランク付けされています。

id | rank | playername | is_available | ranking_name   | ranking_id
-------------------------------------------------------------------
 1 |  1   | testname1   |     1        | australia open |   1
 2 |  2   | testname2   |     1        | australia open |   1
 3 |  3   | testname3   |     0        | australia open |   1
 4 |  4   | testname4   |     1        | australia open |   1
 5 |  1   | testname5   |     1        | japan open     |   2

このテーブルは巨大で、ranking_idごとに500人以上のプレーヤーがいる可能性があります。これで、すべてのプレーヤーは、自分よりx%上の上位プレーヤーとの試合に挑戦できます。このxはsuperadminによって設定されます。x = 10の場合、プレーヤー "testname4"はチャレンジできます(ranking_id * 10/100のプレーヤーの数)= 4 * 10/100 = 0.4は1に丸められます。したがって、testname4は彼の上の1人のプレーヤーにチャレンジできます。しかし、彼の上記のプレーヤー「testname3」は利用できません。したがって、彼は次に利用可能なプレーヤーを与えられるべきです。私は次のような出力が欲しい

//testname4 can challenge below players

id | rank | playername | status        |
--------------------------------------
 2 | 2    | testname2  |   available   |
 3 | 3    | testname3  | not available |

私がしたこと:

 //testname4 wants to challenge. So i know his rank and other information

 $selectSql = mysql_query("SELECT * from rankingTable where ranking_id = 1 AND rank < 4");

これは私にも「testname1」レコードを与えています。どうすればこれを制限できますか?そして、最も大きな問題は、ランクを昇順で表示する必要があることです。ここまでの注文は簡単ではありません。

4

2 に答える 2

2

まず、を実行してチャレンジするユーザーを決定しSELECT ... WHERE is_available = 1 ORDER BY rank DESC LIMIT ?、次にMIN(rank)そのようなユーザーの最高ランクを見つけ、その情報を使用して、自分とそのユーザーの間にランク付けされたユーザーにテーブルをフィルターします。

SELECT   rankingTable.*
FROM     rankingTable, (
  SELECT MIN(a_rank) AS lower, b_rank - 1 AS upper
  FROM (
    SELECT   a.rank AS a_rank, b.rank AS b_rank
    FROM     rankingTable AS a JOIN rankingTable AS b USING (ranking_id)
    WHERE    ranking_id = ?
         AND b.playername = ?
         AND a.rank < b.rank
         AND a.is_available = 1
    ORDER BY a.rank DESC
    LIMIT    ?
  ) AS ranks
) AS limits
WHERE    rank BETWEEN limits.lower AND limits.upper
ORDER BY rank DESC

sqlfiddleでそれを参照してください(選択するユーザー数の決定を含む)。

于 2012-10-27T18:37:37.970 に答える
0

クエリの最後にLIMIT1またはLIMIT0、1(最初、レコード数)を追加してみてください

于 2012-10-27T17:57:18.433 に答える