2010-03-02 24 views
12

Làm cách nào để định dạng truy vấn trên cơ sở dữ liệu MySQL thông qua PHP để tìm địa chỉ IP nằm giữa hai số trong hai trường khác nhau?Tìm số có nằm giữa hai số trong các trường khác nhau trong cơ sở dữ liệu MySQL hay không

đại diện bằng số của địa chỉ IP để tìm: Định dạng

1265631252 

Cơ sở dữ liệu:

IP FROM  IP TO  REGISTRY ASSIGNED CTRY CNTRY COUNTRY 
"1265631232","1265893375","arin","1152835200","US","USA","United States" 
"1265893376","1265958911","arin","1149120000","US","USA","United States" 
"1265958912","1266024447","arin","1149120000","US","USA","United States" 
"1266024448","1266089983","arin","1162425600","US","USA","United States" 
+0

phương pháp tiếp cận "phân chia và chinh phục" có thể hoạt động tốt hơn? chia địa chỉ ip thành 4 trường của smallint (byte), đặt các trường đó trong chỉ mục (phần này là quan trọng), sau đó truy vấn các trường đó trong các điều kiện riêng biệt như (hoặc địa chỉ 127.0.0.1 hoặc điều chỉnh phạm vi): ở đâu (fld1) > = 127) và (fld1 <= 127) và (fld2> = 0) và (fld2 <= 0) và (fld3> = 0) và (fld3 <= 0) và (fld4> = 1) và (fld4 < = 1). Havent đã thử nó, chỉ là một ý tưởng để thử. –

Trả lời

32

Một truy vấn như thế này:

SELECT * FROM your_table WHERE 1265631252 BETWEEN `IP FROM` AND `IP TO`; 

sẽ trả lại hàng (s) mà số được cung cấp là giữa IP FROMIP TO.

+2

Trong thử nghiệm của tôi (MySQL), thực hiện tra cứu địa chỉ IP tương tự, phiên bản "giữa" này là 2x chậm (160-170 msec) như phiên bản này (80-83 msec) "select * from your_table trong đó ip_from <= 1265631252 và ip_to > = 1265631252; ". Khóa chính trên ip_from và chỉ mục duy nhất được tạo trên ip_to được đặt tại thời điểm thử nghiệm. –

1

gì về một cái gì đó như thế này:

select * 
from your_table 
where ip_from <= '1265631252' 
    and ip_to >= '1265631252' 

ví dụ: có được tất cả các dòng mà '1265631252' là giữa ip_fromip_to?

3

Nếu bạn đã có DWORD tương đương với địa chỉ IP thì response from Jordan sẽ thực hiện thủ thuật.

SELECT * FROM your_table WHERE 1265631252 BETWEEN `IP FROM` AND `IP TO`; 

Nếu cần, trước khi thực hiện truy vấn, tính DWORD tương đương với địa chỉ ip bạn có thể thực hiện như sau.

Với một địa chỉ ip a theo hình thức part1.part2.part3.part4 thì DWORD tương đương có thể được tính theo công thức:

dword(a) = ((a.part1 * 256 + a.part2) * 256 + a.part3) * 256 + a.part4 

và sau đó bạn có thể sử dụng dword(a) kết quả trong truy vấn SQL của bạn.

Bắt đầu bằng địa chỉ IP như 206.191.158.55.

((206 * 256 + 191) * 256 + 158) * 256 + 55 

Tương đương dword của địa chỉ IP sẽ là kết quả. Trong trường hợp này là 3468664375.

Xem thêm về DWORD tương đương với địa chỉ ip here.

Các vấn đề liên quan