Выберите минимальные сети для списка IP-адресов - PullRequest
0 голосов
/ 27 марта 2019

У меня есть БД с некоторой сетевой информацией внутри.Структура БД:

ID | network | netmask | description | other_data

Мне нужно выбрать description наименьшей сети, к которой принадлежит адрес.

Я нашел, как это сделать для одного адреса ... Но каксделать это для нескольких адресов (не в БД)?Что-то вроде 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

...