Ответ 1
Один вариант может быть следующим:
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