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 | +-----+--------------+---------+-------+
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.这是为了举例说明,在我的申请中是不同的。我知道我回复晚了。这个表很好,但是您检索排名的方法不准确,它总是返回最高排名。我发现有效的解决方案是:在分数上左加入等级>=最小分数