这可能比我做起来容易,但基本上我需要做的是选择列中具有最接近数字的行作为指定值。例如:
指定列中3行数据库中的值列表:10,15,16
如果我指定我想要最接近14的行,它将选择15行。
此外,如果有2行以上的距离相同,则随机选择其中一行。
答案 0 :(得分: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
答案 1 :(得分:3)
要使用索引,您可以选择目标上方的最小值,以及下面的最大值。那么你只需要检查两个值。
答案 2 :(得分: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