Jednou z možností by bylo něco ve smyslu:
select the_value,
abs(the_value - 14) as distance_from_test
from the_table
order by distance_from_test
limit 1
Chcete-li vybrat náhodný záznam, můžete přidat , rand()
do order by
doložka. Nevýhodou této metody je, že z indexů nezískáte žádnou výhodu, protože musíte třídit podle odvozené hodnoty distance_from_test
.
Pokud máte index na the_value
a uvolníte svůj požadavek na to, aby byl výsledek v případě remíz náhodný, můžete provést pár dotazů s omezeným rozsahem a vybrat první hodnotu bezprostředně nad testovací hodnotou a první hodnotu těsně pod testovací hodnotou a vybrat tu, která je nejbližší na testovací hodnotu:
(
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