Geo IP数据库查询问题

时间:2009-10-04 12:43:27

标签: mysql geocoding

我正在运行此查询

SELECT 
country, 
countries.code, 
countries.lat, 
countries.lng, 
countries.zoom, 
worldip.start, 
worldip.end 

FROM countries, worldip 
WHERE countries.code = worldip.code 
AND 
'91.113.120.5' BETWEEN worldip.start AND worldip.end 
ORDER BY worldip.start DESC

在包含这些字段的表格

worldip           countries
--------------    ----------------
start             code
end               country
code              lat
country_name      lng
                  zoom

有时我会在两个不同的国家/地区为一个ip获得两个结果。我理解为什么

'91.113.120.5' BETWEEN worldip.start AND worldip.end 

会返回两个不同的结果,因为10在9到11之间,但也在5和12之间。我会想到包括WHERE countries.code = worldip.code会阻止这个,或者至少确保我得到了正确的国家,无论多少结果它回来了。但事实并非如此。

我还添加了ORDER BY worldip.start DESC这似乎有效,因为ip地址越准确,它就会显示在列表中。你可以看到它工作(或不工作)here。但这是一个快速解决方案,我想做得对。

SQL对我来说是一个真正的弱点。谁能解释我做错了什么?

1 个答案:

答案 0 :(得分:2)

首先很好的应用程序。我一直在寻找航班 - 我很乐意进行价格比较而不是#based链接。您可以尝试免费的geolocator服务,而不是使用自己的geoip数据库。除此之外,你在MySQL中的'IP' datatype的ip字段允许比较?这可以帮助您获得正确的标准。否则,将这些东西作为字符串进行比较,并且在IP的长度不同等情况下可能会出现问题。

使用IP的整数表示,您可以使用< =和> =运算符。