我有一个表,其中包含角色的排名列表,每个排名与一个数值(xp)相关联。等级越高,需要的 XP 就越多。我想知道构建查询以查找角色所属等级的最简单方法。 这个想法是使用它是一个子查询,所以当选择字符时
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
但我想只用一列来完成排名的下限
更新:
看起来像 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));
有什么建议吗?
最佳答案
这能满足您的需要吗?在这里,xp
是该排名的“目标 XP”。此查询返回 rank
对应于当前角色的 xp 值。
示例:
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
替换 <character xp here>
12000,结果是:
name | rank | xp | diff
Level 1 1 10000 2000
因此,该角色已达到排名 1,并且比排名 1 的目标多了 2000 xp。
关于MySQL Interval() 子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10767802/