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