2012-05-26 84 views
0

我有一個表格,其中包含一個字符的等級列表,每個字符都與一個數字值(xp)關聯。更高的等級是需要更多的XP。我想知道構建查詢來查找角色屬於哪個排名的最簡單方法。 的想法是使用它是一個子查詢,所以選擇角色在子查詢上的MySQL間隔()

SELECT name, xp FROM characters 

的時候我就能夠得到基於對XP量字符排名。如果我使用的行列表兩列的最小值和最大值XP需要很容易:

SELECT 
    name, xp 
    (SELECT rank FROM ranks WHERE xp BETWEEN xp_min AND xp_max) as rank 
FROM characters 

,但我想有它只有一列做了排名的下邊界

UPDATE: 貌似INTERVAL這裏是一個紅色的鯡魚,保持它的搜索目的

我可以使用INTERVAL()功能(MySQL Documentation)對於這一點,如果我編程方式構造查詢:

SELECT INTERVAL(character_xp, rank1, rank2, rank3, rank4) 

但是有沒有辦法使用子查詢來實現這個?以下不工作

SELECT INTERVAL(character_xp, (SELECT rank FROM ranks ORDER by rank)) 

而且也沒有這樣的:

SELECT INTERVAL(character_xp, (SELECT GROUP_CONCAT(rank ORDER BY rank) FROM ranks)); 

有什麼建議?

+0

我也考慮過如下所述添加rank_xp_min和rank_xp_max列http://stackoverflow.com/questions/6995595/mysql-check-if-a-value-is-contained-in-a-range-interval但想如果可能的話,儘量避免這種情況 –

回答

1

這是否做你所需要的?這裏,xp是該等級的「目標xp」。該查詢返回對應於當前字符xp值的rank

例子:

character xp : 12000 

name  | rank | xp 
Level 1 1  10000 
Level 2 2  20000 
Level 3 3  40000 

查詢:

SELECT 
    name, 
    rank, 
    xp, 
    (<character xp here> - xp) AS diff 
FROM ranks 
HAVING diff > 0 
ORDER BY diff ASC 
LIMIT 1 

12000更換<character xp here>,結果是:

name  | rank | xp  | diff 
Level 1 1  10000 2000 

所以,性格已經達到了1級,並且是2000 xp超過排名1的目標。

+0

非常感謝你,確實有效 –

+0

不幸的是,這種方式不能用作我原來的目標的子查詢,所以在接受你之前我會稍微等待另一個答案 –

+0

你是否需要在子查詢中使用'INTERVAL'? –