0

我正在运行这个查询

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 地址越准确,它出现的列表就越高。你可以在这里看到它工作(或不工作)。但这是一个快速的解决方案,我想把它做好。

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

4

1 回答 1

2

首先是不错的应用程序。我正在寻找航班 - 我希望比较价格,但请不要使用 #based 链接。您可以尝试免费的地理定位器服务,而不是使用您自己的 geoip 数据库。除此之外,您在 MySQL中的“IP”数据类型的 ip 字段是否允许比较?这可以帮助您获得正确的序数。否则,这些内容将作为字符串进行比较,并且在 IP 长度不同的情况下可能会出现问题等等。

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

于 2009-10-04T12:56:23.447 回答