2009-10-28 76 views
10

這可能比我做的更容易,但基本上我需要做的是選擇列中最接近數字的行作爲指定值。例如:用MySQL查詢選擇最接近的數值

3行中指定列的數據庫值的列表:10,15,16

如果我指定我想這是最接近14行,它會選擇將該行與15

此外,如果有2+行是相同的距離,隨機選擇其中之一。

回答

21

一個辦法是沿着線的東西:

select the_value, 
     abs(the_value - 14) as distance_from_test 
from  the_table 
order by distance_from_test 
limit 1 

要選擇一個隨機的記錄,你可以添加, rand()order by條款。這種方法的缺點是你沒有從索引中獲益,因爲你必須對派生值distance_from_test進行排序。

如果您有the_value索引和你放鬆你的要求的結果是在關係的情況下,隨機的,您可以執行對有限的範圍內查詢,選擇立即測試值和第一上面的第一個值值正下方的測試值,並挑選最接近取其測試值:

(
select the_value 
from  the_table 
where the_value >= 14 
order by the_value asc 
limit 1 
) 
union 
(
select the_value 
from  the_table 
where the_value < 14 
order by the_value desc 
limit 1 
) 
order by abs(the_value - 14) 
limit 1 
+0

迂腐:'ASC'是默認的排序/順序 - 不需要指定它。 – 2009-10-28 01:56:14

+2

我通常會將其粘貼到我寫的查詢中,以免稍後再回來,並認爲我忘記在:-)中粘貼排序順序。 – 2009-10-28 02:16:07

3

爲了使用索引,你可以選擇目標高於最低值,且低於最大值。那麼你只有兩個值來檢查。

2

你會如何處理領帶破碎機?因爲這樣只會採取先:

SELECT t.col 
    FROM TABLE t 
ORDER BY ABS(t.col - @val) 
    LIMIT 1 

指數安全的替代品:

SELECT xt.col 
    FROM (SELECT t.col, 
       ABS(t.col - @val) 'diff' 
      FROM TABLE t) xt 
ORDER BY xt.diff 
    LIMIT 1