Проблема с гео IP базой - PullRequest
       18

Проблема с гео IP базой

0 голосов
/ 04 октября 2009

Я выполняю этот запрос

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 для меня очень слабое место. Может кто-нибудь объяснить, что я делаю не так?

1 Ответ

2 голосов
/ 04 октября 2009

Во-первых, хорошее приложение. Я искал авиабилеты - мне бы очень понравилось сравнение цен и никаких ссылок # на основе, пожалуйста. Вы можете попробовать бесплатный сервис геолокации вместо использования своей собственной базы геоипов. Кроме того, ваше поле ip типа 'IP' в MySQL позволяет сравнивать? Это может помочь вам получить правильную ординальность. В противном случае данные сравниваются как строки и могут возникнуть проблемы, когда длина IP-адреса различна и т. Д.

С целочисленным представлением IP вы можете использовать операторы <= и> =.

...