2013-04-28 84 views
0

我试图设计一个游戏的数据库,我很难在玩家exp和基于关闭范围的数据库之间建立关联。类似等级1的是0 xp,等级2需要200 exp,3需要400,4需要800等等,我希望能够从“查询不能查询的玩家拥有54234 exp。他是23级”有内置的转换。SQL创建范围

在我见过的每个例子中(在类似的等级范例中),他们有一个学生被分配了一个A级的分数,他们完全忽略了这个事实,即学生得到了一个92可以表示为A.使用学生成绩数据库的人如何从“他的平均分数为73.9”变为“他得到了C”?

在表

CREATE TABLE Hero 
(
    hero INT NOT NULL, 
    totalExpEarned INT NOT NULL, 
    ... 
    PRIMARY KEY(hero) 
); 

CREATE TABLE Level 
(
    level INT NOT NULL, 
    ... 
    PRIMARY KEY(level) 
) 

我能想到这样做将是去像从0-199查找表的最简单方式的简化版本是1级,从200〜399是水平两个等等,这是一个可怕的方式来做到这一点。

+0

老实说,我认为这是一个很好的跳过“优秀设计”规则并预先计算好的问题。也就是说,我会有一个“经验”字段和一个“级别”字段,每次我更新经验时,都会用PHP计算级别,如果它与当前拥有的级别不同,则更新它。它涉及更简单的查询,开销应该是微不足道的。 – ApplePie 2013-04-28 23:12:54

回答

0

把范围为两列到你的等级表中,经验最小值和最大值。我的例子中的最大值是独占的,而最小值是包含值。

CREATE TABLE Level 
(
    level INT NOT NULL, 
    minExp INT NOT NULL, 
    maxExp INT NOT NULL 
    ... 
    PRIMARY KEY(level) 
) 

然后,你可以加入等级和英雄:

SELECT hero, totalExpEarned 
FROM Hero 
INNER JOIN Level ON Hero.totalExpEarned >= Level.minExp 
        AND Hero.totalExpEarned < Level.maxExp 

水平将成立这样的:

Level 1: minExp=0, maxExp=200 
Level 2: minExp=200, maxExp=400 
Level 3: minExp=400, maxExp=800 

这种方法可以让你仰视的水平,只有一个每个级别的行,但是你必须修改你的模式。

+1

我不敢相信我没有想到这一点。我可能会做那样的事情。 – user2309351 2013-04-28 23:21:57

0

与您现有的架构,你可以这样做:

SELECT Hero.hero, MAX(Level.level) 
FROM  Level JOIN Hero ON Hero.totalExpEarned >= Level.level 
GROUP BY Hero.hero 
+0

从阅读这看起来,它总是会尽可能达到最高水平,而不是他们所处的实际水平。 – user2309351 2013-04-28 23:24:10

+0

@ user2309351:这是不正确的。加入标准添加了必要的限制。 – eggyal 2013-04-28 23:26:44

+0

我刚测试过它。它只取得最后一级。 – user2309351 2013-04-28 23:39:01