Mysql
 sql >> база данни >  >> RDS >> Mysql

Резюме на записите с подробности за MySQL, съвпадащи по диапазони на IP адреси - изисква се mySQL Jedi Knight

Със съществуващата си структура от данни можете да направите съвпадение на низове, както следва (но не е много ефективно):

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

По-добър начин би бил да съхранявате вашите IP диапазони като мрежов адрес и дължина на префикса:

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;

Тогава това би било просто случай на извършване на някои битови сравнения:

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. Могат ли съхранените процедури да върнат набор от резултати?

  2. Създайте MySQL съхранена процедура с помощта на JPA Hibernate

  3. Променете масата, без да заключвате цялата маса

  4. Как да определите дали използвате SSL в MySql връзка?

  5. SET GLOBAL max_allowed_packet не работи