У меня две таблицы: один из ip_group_city из ipinfodb.com, содержащий номера ip_start для определения местоположения IP-адресов, а другой – «посещения» с информацией о посетителе веб-сайта, содержащей столбец «ip».
Мне нужно выбрать top 10 region_code (из ip_group_city), проверив region_code для каждого IP из таблицы «посещений».
Сейчас я загружаю все IP-адреса из «посещений» в массив и используя эту информацию IP для запроса ip_group_city:
SELECT region_code FROM ip_group_city WHERE ip_start <= INET_ATON(IP_FROM_ARR) ORDER BY ip_start DESC LIMIT 1
Я не могу создать какой-то вложенный запрос, чтобы выполнить эту работу для меня, потому что сейчас все немного медленнее 🙂 – на моем ноутбуке xampp занимает до 30 секунд (AMD Turion x2 2 ГГц, работает с Windows 7 с 64-битной версией )
Вот таблица с IP-адресами (посещениями)
CREATE TABLE IF NOT EXISTS `visits` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `clientid` mediumint(8) unsigned NOT NULL, `ip` varchar(15) NOT NULL, `url` varchar(512) NOT NULL, `client_version` varchar(64) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=49272 ;
благодаря
Поскольку вы сказали, что другие решения приветствуются …
Возможно, вы захотите проверить MaxMind . У них хороший поиск по стране и городу по IP. Вы можете установить плагин Apache или PHP, чтобы сделать его быстрым – даже не нужно обрабатывать базу данных самостоятельно.
Чтобы индексировать таблицу:
ALTER TABLE `ip_group_city` ADD INDEX ( `ip_start` )
Чтобы получить 10 лучших регистров региона:
SELECT igc.region_code FROM ip_group_city igc JOIN visits v ON igc.ip_start = v.ip GROUP BY igc.region_code ORDER BY COUNT(*) DESC LIMIT 10
ALTER TABLE `ip_group_city` ADD INDEX ( `ip_start` )
вот и все, что я говорю. обязательно используйте btree, а не hash: D
Вы можете проверить этот пост:
Местоположение от ip-адреса