具有各种BETWEEN子句的SQL查询

时间:2015-11-29 14:51:26

标签: mysql

我们说我有一张公司表。 (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范围(从_1,从_1,从_2到2),我们可以写$(document).ready(function(){ var form = $("#Form-3"); var FName = $("#fname"); //Creates Variables for elements in form var Tele = $("#tele"); var Address = $("#address"); var Email = $("#email"); var Credit = $("#Card") var regexp = /^[a-zA-Z0-9]+[a-zA-Z0-9_.-]+[a-zA-Z0-9_.-]+@[a-zA-Z0-9]+[a-zA-Z0-9.-]+[a-zA-Z0-9.]+.[a-z]{2,4}$/; //ragex code- used to validate email FName.blur(validateFName); //blur is a method which attaches a functiom to run when an event occurs Email.blur(validateEmail); Tele.blur(validateTele); Address.blur(validateAddress); Credit.blur(validateCard); form.submit (function(){ if (validateFName() & validateTele() & validateEmail() & validateAddress() & validateCard()){ //If it passes all of these then return true return true; } else { return false; } }); function validateCard(){ //Validates Credit Card var Visa = /^(?:4[0-9]{12}(?:[0-9]{3})?)$/; //Ragex code for Credit Cards var MasterCard = /^(?:5[1-5][0-9]{14})$/; var CC = Credit.val(); $("#Visa").click(function() { //Tick Radio Button $("#Card").show(); if (Visa.test(CC) ){ // If user input is equal to both Visa Or Mastercard Then Valid document.getElementById("CardError").textContent =""; return true; } }); $("#Master").click(function() { //Checks MasterCard button. $("#Card").show(); if(MasterCard.test(CC)){ document.getElementById("CardError").textContent =""; //Display Error return true; } else { document.getElementById("CardError").textContent ="Please Ensure Card Detail Is Correct"; //Display Error return false; } }); } }); 。但我们有VARIANT IP范围。有些公司可能有3或4个IP范围。一种方法是为10个IP范围创建20列。从_1,到_1,从_2,到_2,从_3,到_3 ......还有其他方法吗?如果某个公司的IP范围超过10个怎么办?

1 个答案:

答案 0 :(得分:0)

典型的IP是ABCD,每个A,B,C,D是1字节的int数,其值从0到255,因此您可以将IP视为四位数,基数为256.让&#39 ; s将其转换为整数:

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