1

我有一张桌子,叫做 Level。

id  |  level  |  points(minimum)  
-------------------------
1   |  1      |  0 
2   |  2      |  100 
3   |  3      |  200 

假设我有 189 分,我如何检查用户在哪个级别?

编辑:

选择了最佳答案。现在我通过在 SELECT 查询之前添加 EXPLAIN 来比较请求,我得到了这个结果:

id  |  select_type  |  table  |  type  |  possible_keys  |  key  |  key_len  |  ref  |  rows  |  Extra
-------------------------------------------------------------------------------------------------------------
1   |    SIMPLE     |  level  |   ALL  |       NULL      |  NULL |    NULL   |  NULL |  8   |  Using where


id  |  select_type  |  table  |  type  |  possible_keys  |  key  |  key_len  |  ref  |  rows  |  Extra
-------------------------------------------------------------------------------------------------------------
1   |    SIMPLE     |  level  |   ALL  |       NULL      |  NULL |    NULL   |  NULL |  8   |  Using where; Using filesort

我怎么知道哪个更好或更快?

4

4 回答 4

6

如果您正在寻找玩家当前所在的级别,您希望选择分数要求低于玩家当前拥有的分数的最高级别:

select max(level) from level where points <= 189;

如果每个级别都有一个min_pointsmax_points数量,这可能会更好:

id | level | min_points | max_points
------------------------------------
1  |   1   | 0          | 99
2  |   2   | 100        | 199
3  |   3   | 200        | 299

那么您的查询就不需要聚合:

select * from level where min_points <= 189 && max_points > 189;

编辑:呃,我今晚一直在搞砸我的 SQL,哈哈。

于 2009-12-09T03:20:49.733 回答
2

这根本不需要“介于”或任何类型的聚合函数..您可以选择所有小于点的行,按降序排序,然后第一行应该是正确的。

select level from Level where points <= 189 order by points desc limit 1

(假设 MySQL .. 如果你没有 MySQL,'limit' 可能不起作用)

于 2009-12-09T03:22:27.187 回答
0

我不太确定你的意思,但我认为这就是你想要的:

SELECT `level` FROM `Level` WHERE `points`=189
于 2009-12-09T03:20:05.973 回答
0
select max(level) from level where points <= 189

这假设表中的“点”字段是达到该级别的最低点。

于 2009-12-09T03:25:13.123 回答