【发布时间】:2016-05-24 13:07:16
【问题描述】:
我想创建一个 MySQL 查询来查找子网表中存在的最长匹配(以四点格式的给定 IP 地址)。
最终,我想创建一个LEFT JOIN,它将显示一个表中的每个四点 ip 地址以及另一个表中最长的匹配项。我不想创建任何临时表或将其构建为嵌套查询。
我有点像 MySQL 新手,但我的想法是这样的:
SELECT `ip_address`
LEFT JOIN ON
SELECT `subnet_id`
FROM `subnets_table`
WHERE (`maximum_ip_value` - `minimum_ip_value`) =
LEAST(<list of subnet intervals>)
WHERE INET_ATON(<given ip address>) > `minimum_ip_value`
AND INET_ATON(<given ip address>) < `maximum_ip_value`;
minimum_ip_value 和 maximum_ip_value 是给定子网中可能的最低和最高十进制格式的 IP 地址 - 例如,对于子网 172.16.0.0/16:
minimum_ip_value = 2886729728 (or 172.16.0.0)
maximum_ip_value = 2886795263 (or 172.16.255.255)
而<list of subnet intervals> 包含subnets_table 中的所有区间,其中<given ip address> 介于minimum_ip_value 和maximum_ip_value 之间
如果多个区间包含<given ip address>,则加入最小区间(即最小的子网,或最具体和“最长”的匹配)。
最终,我真正想要的是与该间隔对应的 subnet_id 值。
所以我的问题是:
1) 我可以使用带有任意数量参数的 LEAST() 函数吗?我想比较subnets_table的每一行,或者更具体地说,比较minimum_ip_value和maximum_ip_value之间每一行的间隔,并选择最小的间隔。
2) 我可以在LEFT JOIN 查询中执行所有这些计算吗?我可以接受任何快速、封装并避免重复查询相同数据的建议。
我想知道这是否可以在单个查询中执行(即,不查询每个 IP 地址的子网表),但我不知道是否可以排除它。如果这看起来行不通,请告知,以便我尝试其他角度。
谢谢。
【问题讨论】:
-
请将您的标签限制在您正在使用的 RDBMS 上。对于同一个问题,MySQL 和 SQL Server 通常需要不同的解决方案。
标签: mysql join network-programming longest-prefix