【问题标题】:XP Leveling System - PHPXP 调平系统 - PHP
【发布时间】:2012-09-18 20:53:55
【问题描述】:

排名表

  • 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',);

使用更新后的分数,我如何从上述数组中确定相关排名?

一切都是公开的,这是我第一次创建排名系统,所以我希望能做对:)

【问题讨论】:

  • 最好的解决方案可能是没有你的“排名表”,直接加入成员表和排名表,使用max(rank) where min_score > score,但我想不出怎么写目前查询。
  • 1.为什么“Rank table”字段中的主键不是“RANK”?您可以删除然后主键ID... 2.为什么“排名表”中有字段FK_RANK?分数是这里的精髓。所以如果 rang 改变了就不需要更新,只需保存分数... 3. 为什么 MEMBER 表中没有 SCORE 字段?
  • @BrendanLong 这会准确吗,这不是给出最接近的排名吗?
  • @MichaelRich 我刚刚发布了一个答案来证明它。我最初是向后比较的(应该是score > min_score)。
  • @glavić 1. 答案在于何时删除和添加新行列。 2. 我认为不做join来检索排名会更容易申请。 3. 这是为了说明的目的,在我的应用程序中是不同的。

标签: php ranking


【解决方案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 的索引可能会有所帮助。

如果您确定此连接是一个性能问题(除非you've measured a performance problem,否则请不要这样做),您可以使用类似的查询来更新成员表中的排名,假设它有一个RANK 列:

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

【讨论】:

  • 我知道我回复晚了。该表很好,但是您检索排名的方法不准确,它始终会返回最高排名。我发现可行的解决方案是:LEFT JOIN rank ON score >= min_score
猜你喜欢
  • 2012-10-27
  • 2019-04-30
  • 2021-07-28
  • 2021-03-25
  • 2018-03-12
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多