【问题标题】:How to select in between?两者之间如何选择?
【发布时间】:2009-12-09 03:17:07
【问题描述】:

我有一张桌子,叫做 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

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

【问题讨论】:

  • 列可以更好地命名,如points_limit,或points_cap
  • @mysqllearner:使用解释计划找出更快的方法 - 您可以通过将explain 放在 SELECT 的开头,在 SELECT 之前:EXPLAIN SELECT MAX(level) FROM LEVEL WHERE points <= 189 来做到这一点。如果您需要帮助确定,请发布计划。
  • 当然,我现在正在测试。很快就会发布结果:)
  • 在我的解释测试中,没有索引 & level 是一个整数数据类型,除了 Extra 列之外它们是相同的。 LIMIT 查询具有“使用位置;使用文件排序” - MAX 版本只有“使用位置”。最大值没有“使用文件存储”,它更有效。阅读本文以了解“使用文件排序”的含义:mysqlperformanceblog.com/2009/03/05/…

标签: mysql select points rank


【解决方案1】:

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

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,哈哈。

【讨论】:

  • 我也在考虑最大/最小列,但是 OP 列表的设置是最好的。无需担心一个范围与另一个范围重叠,最大/最小值是基于级别数的列的指数增长。
  • 对不起,不是指数,而是乘法
  • @matt:您的 matt 和 Madcoder 答案似乎运行良好。现在我想知道,哪种方法/查询更好/更快?请指教。即使它在几毫秒内更快
  • 奇怪,我用这个:从点
  • 哦...那你就需要选择 max(id) 了。
【解决方案2】:

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

select level from Level where points &lt;= 189 order by points desc limit 1

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

【讨论】:

    【解决方案3】:

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

    SELECT `level` FROM `Level` WHERE `points`=189
    

    【讨论】:

    • 是的,你误会了。我不是这个意思,但无论如何感谢你试图帮助我:)
    【解决方案4】:
    select max(level) from level where points <= 189
    

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

    【讨论】:

      猜你喜欢
      • 2021-11-14
      • 1970-01-01
      • 2011-02-11
      • 2015-08-05
      • 2014-12-20
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      • 2017-03-07
      相关资源
      最近更新 更多