2011-09-01 91 views
6

我使用的是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

如果你有幾行,然後朝上方的答案就足夠了 - 但是如果你有幾百萬行的我不會推薦它們,因爲它們會掃描整個表 - 而不是看到我的回答底部(與貿易因爲查詢時間更長 - 但速度也更快) –

回答

2

從下面拿的第一個值:

select * from table order by abs(value - $myvalue); 
0
SELECT * FROM table1 ORDER BY ABS(value - '$myvalue') LIMIT 1 
12

假設你有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的<=(值* 1.1)))' – Johan

0

閱讀此頁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

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

可能做一個(慢)表掃描。 –

0

不幸的是,我覺得你的數據庫可能會做涉及abs解決方案的全表掃描,所以他們一旦你的桌子增長,將會非常緩慢。快速運行的解決方案可以在earlier thread中找到。

2
(
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.stackoverflow.com/rooms/41570/so-close-vote-reviewers)是否希望進一步討論。 –

0

試試這個:

SELECT *,abs((columnname -Yourvalue)) as near 
    FROM table 
WHERE order by near limit 0,1 
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 
相關問題