如何从mysql数据库中取得最接近的值

问题描述:

我使用的是mySQLCodeIgniter。我有一些浮点数在我的数据库,如如何从mysql数据库中取得最接近的值

  • 8.3456
  • 8.5555
  • 4.5556

我想...

SELECT * FROM table WHERE value = $myvalue 

,但我不能在我的SELECT查询中使用value = $myvalue,因为$myvalue不完全等于数据库值。我需要从数据库中获取最接近$myvalue的值。如果$myvalue是5我想选择值4.5556

我怎样才能在mySQL中做到这一点?

+0

如果你有几行,然后朝上方的答案就足够了 - 但是如果你有几百万行的我不会推荐它们,因为它们会扫描整个表 - 而不是看到我的回答底部(与贸易因为查询时间更长 - 但速度也更快) –

从下面拿的第一个值:

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 

略更新从他人那里偷窃 - 这应该在假定的公差范围内返回最接近的结果。 (另外,我刚刚注意到哪里是不正确的,道歉 - 现在它应该工作)。

+0

如果最近的$ myvalue比任意值远大于任意的%,该怎么办? – Bohemian

+1

原来的要求不是很清楚。当然,如果没有“可接受的范围”,你可以说10000000000已经足够接近“1”,假设你的数据库中没有什么比这更好的了。在这种情况下,您可以删除“where”部分。 –

+1

注意,这将失败,如果'$ Myvalue'为0。如果你真的想做到这一点,你需要添加'OR(($ myvalue的> =(值* 0.9))AND($ myvalue的 Johan

阅读此页http://dev.mysql.com/doc/refman/5.1/en/mathematical-functions.html#function_round

,但你的选择是这样的

select value from table where ROUND(value) = $myvalue 
+3

如果最近的$ myvalue与任何值相差超过1,该怎么办? – Bohemian

+0

@Bohemian - 在某些时候你会需要一个分界点的匹配值 – Rob

+0

@Bohemian,不,你不说完全取决于你的应用程序,如果** **你需要截断,它应该永远是原始值的百分比。如果你不处理'8.12',而用'15,481,254,454,875,544,545.1'代替? – Johan

select * 
from table 
order by abs(value - $myvalue) 
limit 1 
+2

可能做一个(慢)表扫描。 –

不幸的是,我觉得你的数据库可能会做涉及abs解决方案的全表扫描,所以他们一旦你的桌子增长,将会非常缓慢。快速运行的解决方案可以在earlier thread中找到。

SELECT number, ABS(number - 2500) AS distance 
FROM numbers 
ORDER BY distance 
LIMIT 6 

Selecting closest values in MySQL

(
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 thanless than查询更快。

然后在两个值上做一个ABS没有什么。

这会给你一个我能想到的单一查询中最快的回报。

在整个桌子上做ABS会很慢,因为它会扫描整个桌子。

+0

@LoïcFaure-Lacroix从帖子中删除* shit *而不是仅仅修复拼写。问候。 –

+0

@BhargavRao一句话最后一个点。而这也正是我做什么,你说什么是莱特写如sh1t ... –

+1

@LoïcFaure - 拉克鲁瓦什么意思Bhargav是您编辑没用offens!VE含量为无用的冒犯性的内容,这是不是在改善在所有。当遇到诋毁或各种不良词时,只需将它们编辑出来(无论它们是什么形状)。请[进行聊天](https://chat.*.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