如何从mysql数据库中取得最接近的值
我使用的是mySQL
和CodeIgniter
。我有一些浮点数在我的数据库,如如何从mysql数据库中取得最接近的值
- 8.3456
- 8.5555
- 4.5556
我想...
SELECT * FROM table WHERE value = $myvalue
,但我不能在我的SELECT查询中使用value = $myvalue
,因为$myvalue
不完全等于数据库值。我需要从数据库中获取最接近$myvalue
的值。如果$myvalue
是5我想选择值4.5556
。
我怎样才能在mySQL中做到这一点?
从下面拿的第一个值:
select * from table order by abs(value - $myvalue);
SELECT * FROM table1 ORDER BY ABS(value - '$myvalue') LIMIT 1
假设你有10%的容差(+/-),你可以尝试类似:
select * from table
where value >= ($myvalue * .9) and value <= ($myvalue * 1.1)
order by abs(value - $myvalue) limit 1
略更新从他人那里偷窃 - 这应该在假定的公差范围内返回最接近的结果。 (另外,我刚刚注意到哪里是不正确的,道歉 - 现在它应该工作)。
阅读此页http://dev.mysql.com/doc/refman/5.1/en/mathematical-functions.html#function_round
,但你的选择是这样的
select value from table where ROUND(value) = $myvalue
select *
from table
order by abs(value - $myvalue)
limit 1
可能做一个(慢)表扫描。 –
SELECT number, ABS(number - 2500) AS distance
FROM numbers
ORDER BY distance
LIMIT 6
(
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
会很慢,因为它会扫描整个桌子。
@LoïcFaure-Lacroix从帖子中删除* shit *而不是仅仅修复拼写。问候。 –
@BhargavRao一句话最后一个点。而这也正是我做什么,你说什么是莱特写如sh1t ... –
@LoïcFaure - 拉克鲁瓦什么意思Bhargav是您编辑没用offens!VE含量为无用的冒犯性的内容,这是不是在改善在所有。当遇到诋毁或各种不良词时,只需将它们编辑出来(无论它们是什么形状)。请[进行聊天](https://chat.stackoverflow.com/rooms/41570/so-close-vote-reviewers)是否希望进一步讨论。 –
试试这个:
SELECT *,abs((columnname -Yourvalue)) as near
FROM table
WHERE order by near limit 0,1
得到类似$ 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
如果你有几行,然后朝上方的答案就足够了 - 但是如果你有几百万行的我不会推荐它们,因为它们会扫描整个表 - 而不是看到我的回答底部(与贸易因为查询时间更长 - 但速度也更快) –