2010-03-02 5 views
12

Wie würden Sie eine Abfrage in einer MySQL-Datenbank über PHP formatieren, um herauszufinden, ob eine IP-Adresse zwischen zwei Zahlen in zwei verschiedenen Feldern liegt?Finden Sie, ob die Nummer zwischen zwei Zahlen in verschiedenen Feldern in einer MySQL-Datenbank ist

Numerische Darstellung der IP-Adresse zu finden:

1265631252 

Database Format:

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

vielleicht könnte ein "Teile und herrsche" -Ansatz besser funktionieren? Teilen Sie die IP-Adresse in 4 Felder von smallint (Byte), setzen Sie diese Felder in einen Index (dieser Teil ist wichtig), dann fragen Sie diese Felder in separaten Bedingungen wie (oder Adresse 127.0.0.1, oder passen Sie für einen Bereich an): where (fld1 > = 127) und (fld1 <= 127) und (fld2> = 0) und (fld2 <= 0) und (fld3> = 0) und (fld3 <= 0) und (fld4> = 1) und (fld4 < = 1). Havent versuchte es, nur eine Idee, um es zu versuchen. –

Antwort

32

Eine Abfrage wie folgt aus:

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

Wird die Zeile zurückgeben (n), für die Die angegebene Anzahl liegt zwischen IP FROM und IP TO.

+2

In meiner Prüfung (MySQL), die ähnliche IP-Adress-Lookups durchführt, war diese "zwischen" Version 2x so langsam (160-170 ms) wie diese Version (80-83 ms) "select * from your_table wo ip_from <= 1265631252 und ip_to > = 1265631252; ". Primärschlüssel auf ip_from und eindeutiger Index, der auf ip_to aufgebaut wurde, waren zum Testzeitpunkt vorhanden. –

1

Was ist so etwas wie dieses:

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

das heißt erhalten alle Linien, für die '1265631252' zwischen ip_from und ip_to?

3

Wenn Sie bereits die DWORD-Entsprechung der IP-Adresse haben, dann wird response from Jordan den Trick machen.

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

Wenn Sie müssen, bevor die Abfrage ausgeführt wird, den DWORD-Äquivalent der IP-Adresse, berechnen Sie Folgendes tun können.

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

und dann können Sie verwenden dword(a) Ergebnis in der SQL-Abfrage:

eine IP-Adresse a in Form part1.part2.part3.part4 dann das DWORD äquivalent mit der folgenden Formel berechnet gegeben werden kann.

Beginnen Sie mit einer IP-Adresse wie 206.191.158.55.

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

Das DWord-Äquivalent der IP-Adresse wird das Ergebnis sein. In diesem Fall 3468664375.

Weitere Informationen zu DWORD entsprechen IP-Adressen here.

Verwandte Themen