Един вариант би бил нещо от рода на:
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