2013-04-28 83 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