0

ランク表

  • ID、主キー
  • RANK、ランクまたはレベル、1 が最高、3 が最低
  • MIN_SCORE、ランクに到達するために必要なポイントまたは XP の最小量
  • NAME、ランクの関連付けられた名前

    Rank Table
    +----+------+-----------+-------------------------+
    | ID | RANK | MIN_SCORE |          NAME           |
    +----+------+-----------+-------------------------+
    |  1 |    1 |     18932 | Editor-in-Chief         |
    |  2 |    2 |     15146 | Senior Technical Writer |
    |  3 |    3 |     12116 | Senior Copywriter       |
    +----+------+-----------+-------------------------+
    

ランキング表

  • ID、主キー
  • FK_MEMEBER_ID、メンバーの主キーへの外部キー
  • FK_RANK、著者ランク テーブルのランク列への外部キー (上)
  • SCORE、メンバーの現在の獲得スコアまたは XP

    Ranking Table
    +-----+--------------+---------+-------+
    | ID  | FK_MEMBER_ID | FK_RANK | SCORE |
    +-----+--------------+---------+-------+
    |   1 |            1 |       1 | 17722 |
    |   2 |            2 |       2 | 16257 |
    |   3 |            3 |       3 | 12234 |
    +-----+--------------+---------+-------+
    

私のクラスでは、ランクを保存し、ランク テーブルのランクと一致させ、最小スコアを関連付けました。キーとしてRANK、値としてMINIMUM_SCORE。

メンバーのスコア (XP) が更新されたとき (アップ/ダウン)、その更新されたスコアを以下の配列に対してテストして、ランクも更新する必要があるかどうかを判断したいと思います。

private $scores = array('3' => '12116', '2' => '15146', '1' => '18932',);

更新されたスコアを使用して、上記の配列から相関ランクを決定するにはどうすればよいですか?

すべてが精査に開かれています。ランキングシステムを作成するのはこれが初めてなので、うまくいくことを願っています:)

4

1 に答える 1

1

わかりました、これらのテーブルを考えると:

Ranks
+------+-----------+-------------------------+
| RANK | MIN_SCORE |          NAME           |
+------+-----------+-------------------------+
|  1   |     18932 | Editor-in-Chief         |
|  2   |     15146 | Senior Technical Writer |
|  3   |     12116 | Senior Copywriter       |
+------+-----------+-------------------------+

Members
+-----------+-------+
| MEMBER_ID | SCORE |
+-----------+-------+
|     1     | 17722 |
|     2     | 16257 |
|     3     | 12234 |
+-----+-------------+

以下を使用して、メンバーとそのランクを取得できます。

SELECT m.MEMBER_ID, r.NAME
FROM Members m INNER JOIN Ranks r
ON m.SCORE > r.MIN_SCORE -- Pick ranks that a user is eligible for
WHERE MEMBER_ID = ?
HAVING MAX(r.MIN_SCORE) -- Pick the rank with the highest score

これにより、テーブル全体を削除できるため、コードの保守が容易になります。ランク テーブルが常にメモリ内にあるよりも小さいことを願っていますが、両方のインデックスMIN_SCORERANK役立つ可能性があります。

この結合がパフォーマンスの問題であると判断した場合 (パフォーマンスの問題を測定していない限り、これを実行しないでください)、RANK列があると仮定して、同様のクエリを使用して members テーブルのランクを更新できます。

UPDATE Members
SET RANK = (
    SELECT RANK
    FROM Ranks
    WHERE SCORE > MIN_SCORE
    AND MEMBER_ID = MEMBER_ID
    HAVING MAX(MIN_SCORE)
)
于 2012-09-18T21:10:57.600 に答える