如何从选择中选择最低值

时间:2011-12-28 21:04:42

标签: mysql database select

我正在使用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                             

3 个答案:

答案 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 |
----+-------------+--------+-------+---------------+---------+---------+-------+------+-------------+`
相关问题