假设我有一张公司表。(ID,名称,...,多个IP范围)
每个公司都有一些IP范围(不同范围的IP范围)
一些公司可能只有两个IP范围,例如1.1.1.1-2.2.2.2,3.3.3.3-4.4.4.4
其他公司可能会有更多IP范围。(1.1.1.1-2.2.2.2,3.3.3.3-4.4.4.4,5.5.5.5-6.6.6.6 ...)
我考虑过另一张有关IP范围的表格。(一对多关系)。
问题是,给定了一个任意IP,我应该找到给定IP属于其IP范围的公司。
我怎样才能做到这一点?
例如,如果我们只有两个IP范围(from_1,to_1,from_2,to_2,我们可以编写WHERE (x BETWEEN from_1 AND to_1) OR (x BETWEEN from_2 AND to_2)
。但是我们有VARIANT IP范围。有些公司可能具有3或4个IP范围。一种方法是为20个列创建一个10个IP范围。from_1,to_1,from_2,to_2,from_3,to_3 ...还有其他方法吗?如果某个公司的IP范围超过10个怎么办?
典型的IP是ABCD,每个A,B,C,D都是1字节的整数,其值从0到255,因此您可以将IP视为以256为底的四位数数字。让我们将其转换为整数:
A*255^3 + B*255^2 + C*255 + D
将IP范围的int值保存到db(2列,FROM和TO)中,例如范围为1.1.1.1-2.2.2.2的示例,保存:
FROM = 1*255^3 + 1*255^2 + 1*255 + 1 = 16646656
TO = 2*255^3 + 2*255^2 + 2*255 + 1 = 33293312
现在,通过给定IP,还将其转换为上述整数(假设int值为x),并查询:
SELECT Name FROM IP INNER JOIN COMPANY ON IP.CompanyId = COMPANY.Id
WHERE x BETWEEN `FROM` AND `TO`
例子:
公司表
--------------------
| Id | Name |
--------------------
| 1 | Google |
--------------------
| 2 | Microsoft |
--------------------
IP表
----------------------------------------
| Id | CompanyId | From | To |
----------------------------------------
| 1 | 1 | 16646656 | 33293312 |
----------------------------------------
| 2 | 1 | 11235468 | 15612545 |
例如,给定的IP为17654343,
SELECT * FROM IP INNER JOIN COMPANY ON IP.CompanyId = COMPANY.Id
WHERE 17654343 BETWEEN `FROM` AND `TO`
结果:
Google
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句