выборка ближайшего (в любую сторону) значения

toxic steel

Новичок
выборка ближайшего (в любую сторону) значения

размышляю над задачей:

есть некое цельночисленное значение, получаемое из переменной, допустим 128. из таблицы нужно выбрать одно ближайшее (при условии что нет прямого совпадения):

если есть 123 и 129, то 129 - ближайшее
если есть 127 и 143, то ближайшее - 127

*значение в таблице не уникальное.

понятно, что это можно сделать математикой с подзапросами, начерно даже примерно понятно как (ещё не решил чего выбирать при наличии 127 и 129, правда).

но может есть какая-то дефолтная функция?
буду признателен за название. (ну или за краткий, но ёмкий ответ "нету" :)
*или не дефолтное, но изящное решение

погуглил, но у гугла чё-то с английским не то, он меня не понимает :)
 

toxic steel

Новичок
Mr_Max, спасибо, пошёл изучать.

* эх, а мне так нравилось беззаботное гуманитарное детство :)
 

HraKK

Мудак
Команда форума
SELECT * FROM `tbl_number` WHERE `number` < $number OREDER BY `number` DESC LIMIT 1
 

toxic steel

Новичок
HraKK, "ближайшее" != "ближайшее меньшее".

Mr_Max, искренняя глубочайшаа признательность за именно такую формулировку. это в разы полезней, чем просто ссылка на abs. вкурил много нового.
 

HraKK

Мудак
Команда форума
это решается 2-я запросами.
Мой вариант будет по индексу бегать а вариант с ABS нет вроде ( если я правильно понимаю:
SELECT *, `number - $number as order FROM `tbl_number` WHERE OREDER BY ABS(`order`) ASC LIMIT 1
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
HraKK
Я в контексте
"про дефолтную функцию" ;)

-~{}~ 11.01.09 23:46:

Мой вариант будет по индексу бегать а вариант с ABS нет вроде ( если я правильно понимаю:
Ты все правильно понимаешь.
Запрос с abs будет просматривать таблицу не используя индекс + fliesort
 

toxic steel

Новичок
HraKK, а виртуальная таблица зачем?
без неё прекрасно работает:
SELECT * FROM таблица ORDER BY ABS($переменная-запись) LIMIT 1;
 

HraKK

Мудак
Команда форума
EXPLAIN SELECT * FROM `gggg` WHERE `id` <= 2 ORDER BY `id` ASC LIMIT 1
1 SIMPLE gggg range PRIMARY PRIMARY 4 NULL 3 Using where

EXPLAIN SELECT * FROM `gggg`ORDER BY ABS( `id` -2 ) ASC LIMIT 1
1 SIMPLE gggg ALL NULL NULL NULL NULL 38 Using filesort

Бла-бла-бла?
 

toxic steel

Новичок
нда, зелен я ещё. спасибо за терпение.

-~{}~ 13.01.09 03:10:

HraKK, Mr_Max, а такой вариант:

SELECT * FROM table WHERE importance = (SELECT min(ABS($variable - importance)) FROM table) LIMIT 1;

?
 
Сверху