sql >> Databáze >  >> RDS >> Mysql

Shrnutí podrobných záznamů MySQL odpovídajících rozsahům IP adres - je vyžadován mySQL Jedi Knight

S vaší stávající datovou strukturou byste mohli provést párování řetězců následovně (ale není to příliš efektivní):

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

Lepším způsobem by bylo uložit rozsahy IP jako síťovou adresu a délku prefixu:

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;

Pak by šlo pouze o provedení některých bitových porovnání:

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. Použití sledování kauzality k pochopení provádění dotazu

  2. Jak resetuji pořadová čísla, aby se stala po sobě jdoucí?

  3. Proč MySQL nepoužívá žádný z těchto možných klíčů?

  4. Vyhledání aktuálních pracovních nabídek pro Oracle Forms &Reports