Een optie zou iets zijn in de trant van:
select the_value,
abs(the_value - 14) as distance_from_test
from the_table
order by distance_from_test
limit 1
Om een willekeurig record te selecteren, kunt u , rand()
. toevoegen naar de order by
clausule. Het nadeel van deze methode is dat je geen voordeel haalt uit indices omdat je moet sorteren op de afgeleide waarde distance_from_test
.
Als je een index hebt op the_value
en je versoepelt je eis dat het resultaat willekeurig is in het geval van gelijkspel, je kunt een paar zoekopdrachten met een beperkt bereik uitvoeren om de eerste waarde direct boven de testwaarde en de eerste waarde direct onder de testwaarde te selecteren en de dichtstbijzijnde te kiezen naar de testwaarde:
(
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