假设我有一张公司表。(ID,名称,.,多个IP范围)
每个公司都有一些IP范围(不同的IP范围计数)。
有些公司可能只有两个知识产权范围,比如1.1.1.1-2.2.2.2,3.3.3.3-4.4.4.4
其他公司可能有更多的IP-ranges.(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).但我们有不同的IP范围。有些公司可能有3或4个知识产权范围。一种方法是为10个IP范围创建20列。from_1,to_1,from_2,to_2,from_3,to_3 .还有别的办法吗?如果有些公司有10多个知识产权范围呢?
发布于 2015-11-29 16:29:52
一个典型的IP是A.B.C.D,每一个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`结果:
Googlehttps://stackoverflow.com/questions/33984096
复制相似问题