sql >> Database teknologi >  >> RDS >> Mysql

Oversigt over MySQL-detaljeposter, der matcher efter IP-adresseintervaller - mySQL Jedi Knight påkrævet

Med din eksisterende datastruktur kan du lave strengmatchning som følger (men det er ikke særlig effektivt):

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

En bedre måde ville være at gemme dine IP-områder som netværksadresse og præfikslængde:

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;
 

Så ville det blot være et tilfælde af at udføre nogle bit-sammenligninger:

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. Hvordan kontrollerer man den endelige SQL-parametriserede forespørgsel i PHP med PDO?

  2. Hvordan får man adgang til var-mappen og en MySQL-databasemappe med .frm-, .MYD- og .MYI-filer i hver tabel i CPanel?

  3. Kunne ikke åbne JPA EntityManager for transaktion; indlejret undtagelse er javax.persistence.PersistenceException

  4. SQLite - Kunne ikke åbne databasefilen