我正在使用mySQL
和CodeIgniter
。我的数据库中有一些浮点数,例如
我想......
SELECT * FROM table WHERE value = $myvalue
但我无法在SELECT查询中使用value = $myvalue
,因为$myvalue
与数据库值不完全相同。我需要从数据库中获取最接近$myvalue
的值。
如果$myvalue
为5,我想选择值4.5556
。
我如何在mySQL中执行此操作?
答案 0 :(得分:16)
select *
from table
order by abs(value - $myvalue)
limit 1
答案 1 :(得分:14)
假设您有10%的容忍度(+/-),您可以尝试以下方式:
select * from table
where value >= ($myvalue * .9) and value <= ($myvalue * 1.1)
order by abs(value - $myvalue) limit 1
稍微更新其他人的窃取 - 这应该在假定的容差范围内返回最近的结果。 (另外,我只是注意到哪里不正确,道歉 - 现在应该可以了。)
答案 2 :(得分:4)
(
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
会很慢,因为它会扫描整个表格。
答案 3 :(得分:2)
从以下内容中获取第一个值:
select * from table order by abs(value - $myvalue);
答案 4 :(得分:2)
获取类似于$ 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
答案 5 :(得分:0)
SELECT * FROM table1 ORDER BY ABS(value - '$myvalue') LIMIT 1
答案 6 :(得分:0)
阅读本页http://dev.mysql.com/doc/refman/5.1/en/mathematical-functions.html#function_round
但你的选择看起来像这样
select value from table where ROUND(value) = $myvalue
答案 7 :(得分:0)
不幸的是,我认为您的数据库可能会对涉及abs
的解决方案进行全表扫描,因此一旦您的表增长,它们将会非常慢。可以在此earlier thread中找到快速运行的解决方案。
答案 8 :(得分:0)
SELECT number, ABS( number - 2500 ) AS distance
FROM numbers
ORDER BY distance
LIMIT 6
答案 9 :(得分:0)
试试这个:
SELECT *,abs((columnname -Yourvalue)) as near
FROM table
WHERE order by near limit 0,1
答案 10 :(得分:0)
在我的情况下,我正在使用浏览器的地理位置,并尝试根据表格中的坐标查找最近的城市/州。
表结构:
id zipcode city_state lat lon
1 12345 Example, GA 85.3 -83.2
建议在使用前大力测试-可能需要进行一些调整,但我还是以此为出发点
SELECT city_state,
zipcode,
( Abs( lat - -33.867886 )
+ Abs( lon - -63.987) ) AS distance
FROM zipcodes
ORDER BY distance
LIMIT 1;
对于laravel用户:
$city = Zipcodes::selectRaw
('city_state, zipcode, ( ABS( lat - ? ) + ABS( lon - ?) ) AS distance', [$lat, $lon])
->orderBy('distance')
->first();
echo $city->city_state
希望有一天能对某人有所帮助。