【发布时间】: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. 这是为了说明的目的,在我的应用程序中是不同的。