Salah satu opsi adalah sesuatu seperti:
select the_value,
abs(the_value - 14) as distance_from_test
from the_table
order by distance_from_test
limit 1
Untuk memilih catatan acak, Anda dapat menambahkan , rand()
ke order by
ayat. Kerugian dari metode ini adalah Anda tidak mendapatkan manfaat apa pun dari indeks karena Anda harus mengurutkan berdasarkan nilai turunan distance_from_test
.
Jika Anda memiliki indeks pada the_value
dan Anda melonggarkan persyaratan Anda agar hasilnya acak dalam kasus ikatan, Anda dapat melakukan sepasang kueri rentang terbatas untuk memilih nilai pertama tepat di atas nilai pengujian dan nilai pertama tepat di bawah nilai pengujian dan memilih mana yang paling dekat ke nilai tes:
(
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