我的DB里面有一些网络信息。 数据库结构如下:
ID | network | netmask | description | other_data
我需要选择地址所属的最小网络的description
。
我找到了针对一个地址的方法...但是如何针对多个地址(不在DB中)呢?
像WHERE ip IN ( [list of ip] )
CREATE TABLE `networks` (
`network_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`network` int(10) unsigned NOT NULL,
`mask` int(10) unsigned NOT NULL,
`network_dec` varchar(18) NOT NULL COMMENT 'Сеть в десятичном виде.',
`asn_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`network_id`),
UNIQUE KEY `u1` (`network`,`mask`),
KEY `asn_id` (`asn_id`),
KEY `network` (`network`),
KEY `mask` (`mask`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `networks` (`network`, `mask`, `network_dec`, `asn_id`) VALUES
(INET_ATON('10.20.30.0'), INET_ATON('255.255.255.192'), 'desc_0', 1000),
(INET_ATON('10.20.30.0'), INET_ATON('255.255.255.0'), 'desc_1', 1000),
(INET_ATON('10.20.30.0'), INET_ATON('255.255.255.240'), 'desc_2', 1000),
(INET_ATON('10.20.0.0'), INET_ATON('255.255.0.0'), 'desc_3', 2000),
(INET_ATON('10.20.0.0'), INET_ATON('255.255.240.0'), 'desc_4', 2000),
(INET_ATON('10.0.0.0'), INET_ATON('255.0.0.0'), 'desc_5', 1000),
(INET_ATON('10.0.0.0'), INET_ATON('255.192.0.0'), 'desc_6', 5000),
(INET_ATON('10.0.0.0'), INET_ATON('255.224.0.0'), 'desc_7', 5000),
(INET_ATON('10.0.0.0'), INET_ATON('255.240.0.0'), 'desc_8', 5000),
(INET_ATON('10.0.0.0'), INET_ATON('255.252.0.0'), 'desc_9', 5000),
(INET_ATON('10.0.0.0'), INET_ATON('255.254.0.0'), 'desc_10', 5000),
(INET_ATON('10.0.0.0'), INET_ATON('255.255.0.0'), 'desc_11', 6000);
SQLFiddle的示例:http://sqlfiddle.com/#!9/b339a/5/0