2009-10-28 77 views
10

这可能比我做的更容易,但基本上我需要做的是选择列中最接近数字的行作为指定值。例如:用MySQL查询选择最接近的数值

3行中指定列的数据库值的列表:10,15,16

如果我指定我想这是最接近14行,它会选择将该行与15

此外,如果有2+行是相同的距离,随机选择其中之一。

回答

21

一个办法是沿着线的东西:

select the_value, 
     abs(the_value - 14) as distance_from_test 
from  the_table 
order by distance_from_test 
limit 1 

要选择一个随机的记录,你可以添加, rand()order by条款。这种方法的缺点是你没有从索引中获益,因为你必须对派生值distance_from_test进行排序。

如果您有the_value索引和你放松你的要求的结果是在关系的情况下,随机的,您可以执行对有限的范围内查询,选择立即测试值和第一上面的第一个值值正下方的测试值,并挑选最接近取其测试值:

(
select the_value 
from  the_table 
where the_value >= 14 
order by the_value asc 
limit 1 
) 
union 
(
select the_value 
from  the_table 
where the_value < 14 
order by the_value desc 
limit 1 
) 
order by abs(the_value - 14) 
limit 1 
+0

迂腐:'ASC'是默认的排序/顺序 - 不需要指定它。 – 2009-10-28 01:56:14

+2

我通常会将其粘贴到我写的查询中,以免稍后再回来,并认为我忘记在:-)中粘贴排序顺序。 – 2009-10-28 02:16:07

3

为了使用索引,你可以选择目标高于最低值,且低于最大值。那么你只有两个值来检查。

2

你会如何处理领带破碎机?因为这样只会采取先:

SELECT t.col 
    FROM TABLE t 
ORDER BY ABS(t.col - @val) 
    LIMIT 1 

指数安全的替代品:

SELECT xt.col 
    FROM (SELECT t.col, 
       ABS(t.col - @val) 'diff' 
      FROM TABLE t) xt 
ORDER BY xt.diff 
    LIMIT 1