0

内部にネットワーク情報を含むDBがあります。次のようなDB構造:

ID | network | netmask | description | other_data

descriptionアドレスが属する最小のネットワークを選択する必要があります。

1つのアドレスに対してそれを行う方法を見つけました...しかし、これを複数のアドレスに対して行う方法(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

4

0 に答える 0