1

现在,我有一个 IP,我将其转换为整数,然后尝试从表中找到与某个位置最接近的匹配项。

在此处输入图像描述

我现在正在这样做:

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

有时我没有得到任何结果,因为 $x 掉进了裂缝。

我想知道一种可以获得最近行的方法。

谢谢

4

2 回答 2

1

您可以使用 LEAST 执行此操作,例如:

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

SQL 小提琴示例

于 2012-08-24T18:28:44.157 回答
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 示例

于 2012-08-24T18:40:46.223 回答