Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Podsumowanie szczegółowych rekordów MySQL dopasowanych według zakresów adresów IP — wymagany mySQL Jedi Knight

Przy istniejącej strukturze danych możesz wykonać dopasowywanie ciągów w następujący sposób (ale nie jest to zbyt wydajne):

SELECT   schools.school, detail.filename, COUNT(*)
FROM     schools
    JOIN ipranges ON schools.id = ipranges.school_id
    JOIN detail   ON detail.ip_address LIKE REPLACE(ipranges.ip_range, 'x', '%')
WHERE    schools.consortium_id = ?
GROUP BY schools.school, detail.filename

Lepszym sposobem byłoby zapisanie zakresów adresów IP jako adresu sieciowego i długości prefiksu:

ALTER TABLE ipranges
  ADD COLUMN network INT UNSIGNED,
  ADD COLUMN prefix  TINYINT;
UPDATE ipranges SET
  network = INET_ATON(REPLACE(ip_range, 'x', 0)),
  prefix  = 32 - 8*(CHAR_LENGTH(ip_range) - CHAR_LENGTH(REPLACE(ip_range,'x',''));
ALTER TABLE ipranges
  DROP COLUMN ip_range;

ALTER TABLE detail
  ADD COLUMN ip_address_new INT UNSIGNED;
UPDATE detail SET
  ip_address_new = INET_ATON(ip_address);
ALTER TABLE detail
  DROP COLUMN ip_address,
  CHANGE ip_address_new ip_address INT UNSIGNED;

Wtedy byłby to po prostu przypadek wykonania porównań bitowych:

SELECT   schools.school, detail.filename, COUNT(*)
FROM     schools
    JOIN ipranges ON schools.id = ipranges.school_id
    JOIN detail   ON detail.ip_address & ~((1 << 32 - ipranges.prefix) - 1)
                   = ipranges.network
WHERE    schools.consortium_id = ?
GROUP BY schools.school, detail.filename


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql „Wystąpił błąd -1 z silnika pamięci masowej”

  2. Co monitorować w MySQL 8.0

  3. Jak usunąć tekst między 2 znakami za pomocą zapytania w MYSQL?

  4. wyszukiwanie trafności w wielu powiązanych tabelach

  5. MySQL wstawia dane z innej tabeli