Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Mysql查询以获取最近的记录_Php_Mysql - Fatal编程技术网

Php Mysql查询以获取最近的记录

Php Mysql查询以获取最近的记录,php,mysql,Php,Mysql,我有一张桌子 id startmileage endmileage price 1 1 2 30 2 2 3 50 3 3 4 70 4

我有一张桌子

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到2,2到3之间的价格差。但是对于介于5到25和25到35之间的值,我尝试了一个查询,该查询将适用于最接近的值和精确的值,就像这样

SELECT * 
FROM  table 
ORDER BY ABS( startmileage - myValue ) 
LIMIT 1
但是这个查询只适用于一个输入(StartMilage),因为我需要同时使用开始里程和结束里程来获得最佳的最近记录

有人能告诉我这个问题的最佳答案吗

ORDER BY
(
   greatest(startmileage - $myvalue ,0)
   +
   greatest($myvalue - endmileage ,0)
) ASC , startmileage DESC
如果$myvalue在边界内,则等于零。若在开始编译之前,第一部分将上升,而第二部分为零。如果$myvalue在EndMiledge之后,则第一部分将为零,第二部分将上升

函数
最大(???,0)
仅在大于零时返回
,否则返回零


编辑:稍微优化的查询(工作方式相同):


你能给出一些预期的输入/输出示例吗?我不完全确定你在问什么。你试过使用最小值(ABS(startmileage-myValue)、ABS(endmiliege-myValue))吗?从
cms\u票价表中选择*按最小值排序(ABS(startmileage-7)、ABS(endmiliege-17))限制1这一个给出了语法错误,它与最接近的值配合得很好,但对于精确值,它不是这样的。从
cms\u票价表中选择*按(最大(开始里程-4,0)+最大(4-结束里程,0))限制1返回开始里程=3和结束里程=4。开始里程数=4,结束里程数=5的位置。DUCTAPE quickfix:而不是EndMiledge use(EndMiledge-0.00001),你的意思是这样的?从cms_票价表中按(最大值(起始里程-4,0.00001)+最大值(4-结束里程,0.00001))限制1选择*这也会返回相同的记录问题在于,上一里程的结束与下一里程的开始是相同的数值。我必须做出改变,一个微小的改变。好吧,现在我考虑了一下,这个解决方案更好:(如果不确定的情况发生,这只会优先考虑更新的里程数);我更新了我的答案。
ORDER BY
greatest(startmileage - $myvalue , $myvalue - endmileage ) ASC
, startmileage DESC