首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有各种中间子句的SQL查询

带有各种中间子句的SQL查询
EN

Stack Overflow用户
提问于 2015-11-29 14:51:26
回答 1查看 35关注 0票数 0

假设我有一张公司表。(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多个知识产权范围呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-29 16:29:52

一个典型的IP是A.B.C.D,每一个A、B、C、D都是一个1字节整数,值从0到255,因此您可以将IP看作一个基数为256的四位数字。让我们将其转换为整数:

代码语言:javascript
复制
A*255^3 + B*255^2 + C*255 + D

将IP范围的int值保存到db (2列,FROM和TO),例如范围为1.1.1.1-2.2.2.2,则保存:

代码语言:javascript
复制
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),并进行查询:

代码语言:javascript
复制
SELECT Name FROM IP INNER JOIN COMPANY ON IP.CompanyId = COMPANY.Id
WHERE x BETWEEN `FROM` AND `TO`

示例:

公司

代码语言:javascript
复制
--------------------
| Id | Name        |
--------------------
| 1  | Google      |
--------------------
| 2  | Microsoft   |
--------------------

IP

代码语言:javascript
复制
----------------------------------------
| Id | CompanyId | From     | To       |
----------------------------------------
| 1  | 1         | 16646656 | 33293312 |
----------------------------------------
| 2  | 1         | 11235468 | 15612545 |

例如,给定的IP是17654343,

代码语言:javascript
复制
  SELECT * FROM IP INNER JOIN COMPANY ON IP.CompanyId = COMPANY.Id
  WHERE 17654343 BETWEEN `FROM` AND `TO`

结果:

代码语言:javascript
复制
Google
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33984096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档