我有一个表格,其中包含一个字符的列表列表,每个列表都与一个数字值(xp)相关联。排名越高,需要的XP越多。我想知道构建查询以查找角色所属等级的最简单方法。 这个想法是使用它是一个子查询,所以在选择字符时
SELECT name, xp FROM characters
我可以根据 XP 的数量获得 rank 字符。如果我在rank表中使用了两列,那么min和max XP就很容易了:
SELECT
name, xp
(SELECT rank FROM ranks WHERE xp BETWEEN xp_min AND xp_max) as rank
FROM characters
但是我希望只用一列来完成等级的下边界
更新
看起来像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 :(得分: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,并且比等级1的目标高出2000 xp。