2012-08-24 78 views
1

現在,我有一個IP,我將其轉換爲一個整數,然後嘗試從表中找到最接近的匹配位置。MySQL在兩列之間找到最接近的整數

enter image description here

我現在這樣做的:

$sql = "SELECT * FROM table WHERE IP_FROM >= $x AND IP_TO <= $x LIMIT 1;"; 

,有時我沒有得到任何結果爲$ X通過裂縫下降。

我想知道一種方法,我可以得到最近的一排。

感謝

回答

1

你可以用至少要做到這一點,如:

select * 
from Table1 t 
order by LEAST(abs(t.IP_FROM - 123), abs(t.IP_TO - 123)) 
LIMIT 1 

SQL Fiddle Example

+0

太棒了,我會試試。 – PaulM

+0

看到我的更新,我只是實現了一個更簡單的方法。 – RedFilter

+0

此查詢將始終執行全表掃描。 geoip數據庫有超過100,000條記錄,geoip_city數據庫有超過300萬條記錄。不是您想要進行表格掃描的那種表格。此答案不會執行表掃描:http://stackoverflow.com/a/12114949/1432614 –

1

這應該適用於所有情況:

(SELECT * FROM geoip FORCE INDEX (IP_FROM) WHERE IP_FROM <= $x ORDER BY IP_FROM DESC LIMIT 1) 
UNION 
(SELECT * FROM geoip FORCE INDEX (IP_TO) WHERE IP_TO >= $x ORDER BY IP_TO LIMIT 1) 

這會給你兩行,如果第一行不是你想要的行,那麼第二行就是。

SqlFiddle example

+0

這不會給出準確的結果。在一個例子中,第一行是倫敦,第二行是南安普敦。 – PaulM

+0

我修改了查詢,請再試一次。 –

相關問題