Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wählen Sie den nächsten numerischen Wert mit der MySQL-Abfrage aus

Eine Option wäre so etwas wie:

select   the_value,
         abs(the_value - 14) as distance_from_test
from     the_table
order by distance_from_test
limit 1

Um einen zufälligen Datensatz auszuwählen, können Sie , rand() hinzufügen zum order by Klausel. Der Nachteil dieser Methode ist, dass Sie keinen Nutzen aus Indizes ziehen, da Sie nach dem abgeleiteten Wert distance_from_test sortieren müssen .

Wenn Sie einen Index auf the_value haben und Sie lockern Ihre Anforderung, dass das Ergebnis im Fall von Unentschieden zufällig sein muss, können Sie ein Paar Abfragen mit begrenztem Bereich durchführen, um den ersten Wert direkt über dem Testwert und den ersten Wert direkt unter dem Testwert auszuwählen und den nächstliegenden auszuwählen zum Testwert:

(
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