我正在使用MySQL 5.1
表用户:
id | exp
---------
5 | 5
4 | 9
表级别:
id|min_exp
----------
1 | 0
2 | 5
3 | 8
如何用他的levels.id选择用户?
我需要加入表用户和级别。 这必须是有效的:
users.exp >= levels.min_exp
和min_exp应该是最低的。
预期产出:
users.id|users.exp|levels.id|levels.min_exp
5 | 5 | 2 | 5
4 | 9 | 3 | 8
答案 0 :(得分:4)
如果level.id中没有空白,您可以通过加入levels
两次并避免聚合来获得更好的效果:
select users.id, users.exp, current_level.id, current_level.min_exp
from levels current_level
join levels next_level on next_level.id = current_level.id + 1
join users on users.exp >= current_level.min_exp
and users.exp < next_level.min_exp
如果您经常需要最小/最大体验支架,我建议您current_level
/ next_level
加入视图。
编辑:我刚刚意识到这对于最高级别的用户来说是失败的。根据你想要处理的方式(用户是否停止获得最大XP或继续获得它而不增加等级?),你可以在levels
中添加高于最高等级的虚拟记录,或者进行next_level
加入外部联接。
答案 1 :(得分:1)
您想要用户可以看到的最低级别:
select
u.id as UserId,
MIN(l.id) as LevelId
from
Users u
inner join Levels l on
u.exp >= l.min_exp
group by
u.Id
如果您只想要特定用户:
select
u.id as UserId,
MIN(l.id) as LevelId
from
Users u
inner join Levels l on
u.exp >= l.min_exp
where
u.id = 5
group by
u.Id
答案 2 :(得分:1)
这个问题措辞不明确,但从上下文来看,看起来你正在寻找一个人在当前exp和min_exp时达到的最高水平。
由于您知道要查找的用户的ID,因此查询可以是
select users.id as uid,users.exp,levels.id as levelid from users,levels where users.id = 4 and levels.min_exp <= users.exp order by levelid desc limit 1
如果你确保两个表都有适当的索引
alter table users add primary key (id)
alter table levels add primary key (id)
alter table levels add unique key(min_exp);
(非主键索引也可以) 然后查询非常有效:
explain select users.id as uid,users.exp,levels.id as levelid from users,levels where users.id = {{uid}} and levels.min_exp <= users.exp order by levelid desc limit 1;
+----+-------------+--------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+-------+---------------+---------+---------+-------+------+-------------+
| 1 | SIMPLE | users | const | PRIMARY | PRIMARY | 4 | const | 1 | |
| 1 | SIMPLE | levels | index | min_exp | PRIMARY | 4 | NULL | 1 | Using where |
----+-------------+--------+-------+---------------+---------+---------+-------+------+-------------+`