Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobieranie klasy C z adresu IP
Forum PHP.pl > Forum > Bazy danych > MySQL
Northulus
Witam,

Mam tabelę, w której jedna z kolumn to 'ip', w której, jak nietrudno się domyślić, przechowuję adresy IP smile.gif

Chcę pobrać wszystkie unikalne (nie powtarzające się) adresy IP, które należą do klasy C.
Tutaj, jako klasa C należy rozumieć adresy XXX.XXX.XXX.ZZZ.

Napisałem zatem zapytanie:
  1. <?$sql="SELECT DISTINCT ip FROM katalogi WHERE ip REGEXP '^[1-9]*\\.[1-9]*\\.[1-9]*';";?>


Niestety, zapytanie zwraca unikalne adresy nie z klasy C, jednak wszystkie unikalne adresy.

Mówiąc prosto, chcę aby zostały zwrócone wszystkie unikalne adresy zaczynające się na
XXX.XXX.XXX

czyli odrzucamy końcowy oktet adresu.

Dodam, że jeżeli wpiszę
  1. <?$sql="SELECT DISTINCT ip FROM katalogi WHERE ip REGEXP '^[1-9]{3}\\.[1-9]*\\.[1-9]*';";?>

To także wyświetla wszystkie unikalne adresy.

Natomiast, jeśli wpiszę:
  1. <?$sql="SELECT DISTINCT ip FROM katalogi WHERE ip REGEXP '^178\\.[1-9]*\\.[1-9]*';";?>

To wyświetli wszystkie adresy zaczynające się na 178.

Dla wyjaśnienia, zapytanie, które wpisuję rozumiem tak:
  1. <?$sql="SELECT DISTINCT ip FROM katalogi WHERE ip REGEXP '^[1-9]{1}\\.[1-9]*\\.[1-9]*';";?>

Pobierz wszystkie unikalne dane z kolumny ip, tabeli katalogi, gdzie ip zaczyna się od dowolnej cyfry występującej wiecej niż jeden raz, następnie występuje kropka, potem cyfra występująca więcej niż jeden raz, znowu kropka i znów cyfra występująca więcej niż jeden raz.

Pozdrawiam i proszę o pomoc,
Northulus.
bww
jeżeli wszystkie adresy mają format xxx.xxx.xxx to można
  1. SELECT DISTINCT substr(ip,1,11)
Northulus
Niestety, zdarzają się też adresy XX.XXX.XX

Zatem doszedłem do wniosku, że moim "punktem kontrolnym" będzie kropka.
bww
Nie kojarzę funkcji, która zwróci miejsce trzeciej kropki, ale możesz spróbować skorzystać z funkcji LOCATE na zasadzie LOCATE('.', ip, LOCATE('.', ip)) ...
trafas
A może coś takiego:

  1. select
  2. ip,
  3. reverse(ip) as 'Odwrócony adres IP',
  4. substring_index(reverse(ip),'.',1) as 'pierwsza część odwróconego adresu',
  5. length(substring_index(reverse(ip),'.',1)) as 'długość pierwszej części odwróconego adresu',
  6. reverse(substring_index(reverse(ip),'.',1)) as 'adres klasy C',
  7. left(ip, length(ip)-length(substring_index(reverse(ip),'.',1)) - 1) as 'Adres IP bez klacy C'
  8. from adresy
Northulus
Niestety, nic nie pomogło.

Chcę pobrać ilość unikalnych adresów klasy C (tutaj chodzi tylko o trzy pierwsze oktety) z bazy danych.

Mam np. adresy:
72.211.213.111
72.211.213.221
73.211.215.215
73.211.215.244
54.253.199.109

I tutaj zlicza:

72.211.213.X
72.211.213.X
73.211.215.X
73.211.215.X
54.253.199.X

72.211.213.X - wystapiło 2 razy
73.211.215.X - wystapiło 2 razy
54.253.199.X - wystąpiło 1 raz

sumuje...
łacznie wystapiło 5 razy
wyszukuje jedynie unikalne adresy...
łącznie wyświetla, że unikalnych adresów jest 3.

Wierzę, że teraz rozjaśniłem szerzej mój problem smile.gif

Proszę o pomoc! smile.gif



Edit:

Sądzę, że znalazłem rozwiązanie swojego problemu.

Użyłem zapytania:
  1. SELECT DISTINCT SUBSTRING_INDEX (ip, '.' , 3),count(DISTINCT ip) FROM adresy GROUP BY ip


Działa tak, jak chciałem.

Dziękuję wszystkim za pomoc, w szczególności trafas'owi za wskazanie kierunku rozwiązania problemu smile.gif

Pozdrawiam,
Northulus.
webdice
  1. SELECT COUNT( `ip` ) AS `count` FROM `ip` GROUP BY SUBSTRING_INDEX( `ip`, '.', 3 )
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.