Mysql
 sql >> Database >  >> RDS >> Mysql

Seleziona il valore numerico più vicino con la query MySQL

Un'opzione potrebbe essere qualcosa sulla falsariga di:

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

Per selezionare un record casuale, puoi aggiungere , rand() al order by clausola. Lo svantaggio di questo metodo è che non ottieni alcun vantaggio dagli indici perché devi ordinare il valore derivato distance_from_test .

Se hai un indice su the_value e allenti la tua esigenza che il risultato sia casuale in caso di parità, puoi eseguire un paio di query a intervallo limitato per selezionare il primo valore immediatamente sopra il valore del test e il primo valore immediatamente sotto il valore del test e scegliere quello più vicino al valore di prova:

(
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