как получить ближайшее значение из базы данных в MySQL - PullRequest
8 голосов
/ 01 сентября 2011

Я использую mySQL и CodeIgniter.У меня есть некоторые числа с плавающей точкой в ​​моей базе данных, такие как

  • 8.3456
  • 8.5555
  • 4.5556

Я хочу ...

SELECT * FROM table WHERE value = $myvalue

, но я не могу использовать value = $myvalue в своем запросе SELECT, потому что $myvalue не совсем равен значениям базы данных.Мне нужно получить ближайшее значение $myvalue из базы данных.

Если $myvalue равно 5, я хочу выбрать значение 4.5556.

Как я могу это сделать в MySQL?

Ответы [ 10 ]

16 голосов
/ 01 сентября 2011
select * 
from table 
order by abs(value - $myvalue)
limit 1
14 голосов
/ 01 сентября 2011

Предполагая, что у вас есть допуск 10% (+/-), вы можете попробовать что-то вроде:

select * from table 
where value >= ($myvalue * .9) and value <= ($myvalue * 1.1) 
order by abs(value - $myvalue) limit 1

Слегка обновленный воровство от других - это должно вернуть ближайший результат в предполагаемом диапазоне допуска.(Кроме того, я только что заметил, где было неправильно, извинения - теперь это должно работать).

4 голосов
/ 09 июня 2014
(
select   *
from     table
where    value >= $myvalue
order by value asc
limit 1
)
union
(
select   *
from     table
where    value < $myvalue
order by value desc
limit 1
)
order by abs(value - $myvalue)
limit 1

Это может показаться нелогичным, но скорость будет выше, чем другие запросы, показанные до сих пор.

Это связано с тем, что запросы greater than и less than выполняются быстрее.

Тогда выполнение ABS для двух значений - ничто.

Это даст вам самый быстрый возврат в одном запросе, который я только могу придумать.

Выполнение ABS на всей таблице будет медленным, так как будет сканировать всю таблицу.

2 голосов
/ 07 апреля 2017

Получите наибольшее значение, подобное $ val:

SELECT * FROM tab WHERE val <= $val ORDER BY val DESC LIMIT 1

Получите наименьшее значение, подобное $ val:

SELECT * FROM tab WHERE val >= $val ORDER BY val LIMIT 1

Получите ближайшее значение, подобное $ val в любом направлении:

SELECT * FROM tab ORDER BY abs(val - $val) LIMIT 1
2 голосов
/ 01 сентября 2011

Примите первое значение из следующего:

select * from table order by abs(value - $myvalue);
0 голосов
/ 07 апреля 2017

Попробуйте это:

SELECT *,abs((columnname -Yourvalue)) as near
  FROM table
 WHERE order by near limit 0,1
0 голосов
/ 21 мая 2014
SELECT number, ABS( number - 2500 ) AS distance
FROM numbers
ORDER BY distance
LIMIT 6

Выбор ближайших значений в MySQL

0 голосов
/ 02 сентября 2011

К сожалению, я думаю, что ваша база данных, вероятно, выполнит полное сканирование таблиц для решений, которые включают abs, поэтому они будут (очень) медленными по мере роста вашей таблицы.Быстродействующее решение можно найти в этой более ранней теме .

0 голосов
/ 01 сентября 2011

Прочитайте эту страницу http://dev.mysql.com/doc/refman/5.1/en/mathematical-functions.html#function_round

но ваш выбор будет выглядеть так

select value from table where ROUND(value) = $myvalue 
0 голосов
/ 01 сентября 2011
SELECT * FROM table1 ORDER BY ABS(value - '$myvalue') LIMIT 1 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...