2012-08-24 42 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

我修改了查询,请再试一次。 –

相关问题