【发布时间】:2017-07-08 16:04:43
【问题描述】:
我有一个包含以下表格的 MySQL 数据库:
CREATE TABLE IF NOT EXISTS `auth` (
`id` int(11) NOT NULL auto_increment,
`session` char(32) NOT NULL,
`success` tinyint(1) NOT NULL,
`username` varchar(100) NOT NULL,
`password` varchar(100) NOT NULL,
`timestamp` datetime NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `sessions` (
`session` char(32) NOT NULL,
`starttime` datetime NOT NULL,
`endtime` datetime default NULL,
`ip` varchar(15) NOT NULL default '',
PRIMARY KEY (`id`)
);
CREATE TABLE `geoip_blocks` (
`gbl_block_start` int(10) unsigned NOT NULL,
`gbl_block_end` int(10) unsigned NOT NULL,
`gbl_glc_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`gbl_block_start`,`gbl_block_end`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `geoip_locations` (
`glc_id` int(10) unsigned NOT NULL,
`glc_country` char(2) NOT NULL,
`glc_region` varchar(2) NOT NULL,
`glc_city` varchar(64) NOT NULL,
`glc_zip` varchar(16) NOT NULL,
`glc_latitude` decimal(7,4) NOT NULL,
`glc_longitude` decimal(7,4) NOT NULL,
PRIMARY KEY (`glc_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
geoip_blocks 和 geoip_locations 是从 MaxMind 的免费旧版地理定位数据库中导入的。
我想创建一个报告,其中包含 auth.success 等于 1 的所有会话的时间戳、IP 号码和地理位置数据(国家、纬度、经度)。
我可以轻松创建auth.success 等于 1 的所有会话的时间戳和 IP 编号的报告:
SELECT
UNIX_TIMESTAMP(auth.timestamp) as time_sec,
sessions.ip as ip
FROM auth
INNER JOIN sessions ON auth.session = sessions.session
WHERE auth.success = 1
给定一个 IP 号码 ip,我可以获得它的地理位置数据:
SELECT
geoip_locations.glc_country as country,
geoip_locations.glc_latitude as lat,
geoip_locations.glc_longitude as lon
FROM geoip_blocks INNER JOIN geoip_locations
ON geoip_locations.glc_id = geoip_blocks.gbl_glc_id
WHERE gbl_block_start <= INET_ATON(ip)
ORDER BY gbl_block_start DESC
LIMIT 1
但是我应该使用什么样的查询来获得我需要的那种报告(对于上面第一个查询会产生的所有 IP)?
【问题讨论】: