這可能比我做的更容易,但基本上我需要做的是選擇列中最接近數字的行作爲指定值。例如:用MySQL查詢選擇最接近的數值
3行中指定列的數據庫值的列表:10,15,16
如果我指定我想這是最接近14行,它會選擇將該行與15
此外,如果有2+行是相同的距離,隨機選擇其中之一。
這可能比我做的更容易,但基本上我需要做的是選擇列中最接近數字的行作爲指定值。例如:用MySQL查詢選擇最接近的數值
3行中指定列的數據庫值的列表:10,15,16
如果我指定我想這是最接近14行,它會選擇將該行與15
此外,如果有2+行是相同的距離,隨機選擇其中之一。
一個辦法是沿着線的東西:
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
爲了使用索引,你可以選擇目標高於最低值,且低於最大值。那麼你只有兩個值來檢查。
你會如何處理領帶破碎機?因爲這樣只會採取先:
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
迂腐:'ASC'是默認的排序/順序 - 不需要指定它。 – 2009-10-28 01:56:14
我通常會將其粘貼到我寫的查詢中,以免稍後再回來,並認爲我忘記在:-)中粘貼排序順序。 – 2009-10-28 02:16:07