XP水准测量系统-PHP

XP水准测量系统-PHP,php,ranking,Php,Ranking,排名表 ID,主键 等级,等级或级别,1为最高,3为最低 MIN_分数,达到排名所需的最低分数或经验值 名称,列组的关联名称 Rank Table +----+------+-----------+-------------------------+ | ID | RANK | MIN_SCORE | NAME | +----+------+-----------+-------------------------+ | 1 | 1 | 1

排名表

  • ID,主键
  • 等级,等级或级别,1为最高,3为最低
  • MIN_分数,达到排名所需的最低分数或经验值
  • 名称,列组的关联名称

    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_排名,作者排名表排名列的外键(顶部)
  • 分数,成员当前的已赢得分数或XP

    Ranking Table
    +-----+--------------+---------+-------+
    | ID  | FK_MEMBER_ID | FK_RANK | SCORE |
    +-----+--------------+---------+-------+
    |   1 |            1 |       1 | 17722 |
    |   2 |            2 |       2 | 16257 |
    |   3 |            3 |       3 | 12234 |
    +-----+--------------+---------+-------+
    
在我的课堂上,我存储了等级——与等级表中的等级相匹配——并关联了最低分数;排名为关键,最低分数为价值

当一个成员的分数(XP)被更新(向上/向下)时,我想根据下面的数组测试更新后的分数,以确定他们的排名是否也需要更新

private $scores = array('3' => '12116', '2' => '15146', '1' => '18932',);
使用更新的分数,我如何从上面的数组中确定相关秩


一切都有待仔细检查,这是我第一次创建一个排名系统,所以我希望它是正确的:)

好的,鉴于这些表格:

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_SCORE
rank
进行索引可能会有所帮助

如果确定此联接是一个性能问题(请不要这样做,除非),则可以使用类似的查询来更新members表中的列,假设它有一个
RANK
列:

UPDATE Members
SET RANK = (
    SELECT RANK
    FROM Ranks
    WHERE SCORE > MIN_SCORE
    AND MEMBER_ID = MEMBER_ID
    HAVING MAX(MIN_SCORE)
)

最好的解决方案可能是不使用“排名表”,直接使用
max(rank)where min_score>score
连接members表和rank表,但我现在想不出如何编写查询。1。为什么“排名表”字段中的主键不是“排名”?您可以删除然后主键ID。。。2.为什么在“排名表”中有字段FK_排名?分数就是这里的存在。所以,如果范围更改,则无需更新,只需保存分数。。。3.为什么在成员表中没有分数字段?@BrendanLong这是否准确?这不是给出最接近的排名吗?@MichaelRich我刚刚发布了一个答案来说明这一点。我最初是向后比较的(应该是
score>min_score
)。@glavić1。答案在于何时需要删除和添加新的等级。2.我认为不进行连接来检索排名会更容易。3.这是为了举例说明,在我的申请中是不同的。我知道我回复晚了。这个表很好,但是您检索排名的方法不准确,它总是返回最高排名。我发现有效的解决方案是:在分数上左加入等级>=最小分数