如何根据经验值关联用户表与等级表查询对应等级?
解决方案:根据用户EXP匹配对应等级
针对你的需求,这里提供两种常用的SQL实现方式,同时解答你的疑问:
方法1:使用JOIN结合聚合函数
这种方式通过关联用户表和等级表,筛选出用户EXP大于等于等级EXP的所有记录,再取最大的等级值:
SELECT u.id, u.name, u.exp, MAX(l.level) AS level FROM user u JOIN level l ON u.exp >= l.exp GROUP BY u.id, u.name, u.exp;
执行后会得到你期望的结果:
id|name|exp|level 1|test|270|3 2|foo |510|4
方法2:使用子查询
针对每个用户单独查询对应等级,逻辑更直观:
SELECT id, name, exp, (SELECT MAX(level) FROM level l WHERE l.exp <= u.exp) AS level FROM user u;
对你疑问的解答:
是否需要使用JOIN?
不是必须的,但JOIN是实现这类关联匹配的常用方案,若后续需要从level表获取更多字段(比如等级名称),JOIN会更方便。能否用子查询?
完全可以,上面的方法2就是子查询的实现方式,每个用户行都会执行一次子查询,精准匹配对应等级。是否需要用BETWEEN进行判断?
不需要。因为level表的EXP是递增的,只需要找到最大的、小于等于用户EXP的等级EXP即可。如果用BETWEEN,需要手动定义每个等级的区间(比如level 3对应250 <= exp < 500),后续新增等级时还需修改查询,灵活性较差。
内容的提问来源于stack exchange,提问作者Saffe
相关产品推荐
相关产品推荐

