2014-11-04 5 views
-1

У меня есть таблицаMysql запрос, чтобы получить ближайшую запись

id    startmileage  endmileage  price 
1     1     2    30 
2     2     3    50 
3     3     4    70 
4     4     5    100 
5     5     25   4.5    
6     25     35    7 

В этой таблице я сохранный данные, чтобы получить цену между пробегами (от начала до конца мили) я могу получить цену от 1 разницы значение как 1 к 2, 2 до 3. Но для значений от 5 до 25 и от 25 до 35 я попробовал запрос, который будет работать как для самого близкого и точного значения, как этот

SELECT * 
FROM table 
ORDER BY ABS(startmileage - myValue) 
LIMIT 1 

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

Может кто-нибудь, пожалуйста, скажите мне лучший запрос для этого?

+0

Можете ли вы дать некоторые ожидаемые примеры ввода/вывода? Я не совсем уверен, что вы спрашиваете. – Erik

+0

Вы пробовали использовать MIN (ABS (запуск - myValue), ABS (endmileage - myValue))? –

+0

SELECT * ОТ 'cms_farechart' ORDER BY MIN (ABS (пусковая рама - 7), ABS (конечный конец - 17)) limit 1 Эта ошибка дает синтаксическую ошибку – Googler

ответ

0
ORDER BY 
(
    greatest(startmileage - $myvalue ,0) 
    + 
    greatest($myvalue - endmileage ,0) 
) ASC , startmileage DESC 

если $ myvalue находится в пределах границ, это будет равно нулю. Если это до начала старта, первая часть будет повышаться, а вторая равна нулю. Если $ myvalue после окончания курса, первая часть будет равна нулю, а вторая будет повышаться.

Функция greatest(??? , 0) вернет ??? только тогда, когда она больше нуля, возвращая ноль в противном случае.


редактировать: Немного оптимизирован запрос (работает так же):

ORDER BY 
greatest(startmileage - $myvalue , $myvalue - endmileage) ASC 
, startmileage DESC 
+0

Работает хорошо с ближайшим значением, но точно не так. SELECT * FROM ' cms_farechart' ORDER BY ( НАИБОЛЬШЕГО (startmileage -4, 0) + ВЕЛИЧАЙШАЯ (4 - endmileage, 0) ) ПРЕДЕЛ 1 Это возвращается старт пробег = 3 и 4. endmileage = Где это должно быть, как пуск пробега = 4 и конечный пробег = 5 – Googler

+0

ductape quickfix: вместо использования в конце пути (endmileage-0.00001) – David162795

+0

Вы имеете в виду вот так? SELECT * ОТ cms_farechart ORDER BY ( НАИБОЛЬШЕГО (startmileage -4, 0,00001) + НАИБОЛЬШЕГО (4 - endmileage, 0,00001) ) ПРЕДЕЛ 1 Это также возвращает ту же запись – Googler

Смежные вопросы