Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Ringkasan catatan detail MySQL yang cocok dengan rentang alamat IP - diperlukan mySQL Jedi Knight

Dengan struktur data yang ada, Anda dapat melakukan pencocokan string sebagai berikut (tetapi tidak terlalu efisien):

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

Cara yang lebih baik adalah dengan menyimpan rentang IP Anda sebagai alamat jaringan dan panjang awalan:

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;

Maka itu hanya akan menjadi kasus melakukan beberapa perbandingan kecil:

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. Apakah saya memerlukan koneksi php mysql di setiap fungsi yang menggunakan database?

  2. MySQL Ubah Collation dari Semua Tabel

  3. Fungsi MySQL FLOOR() – Membulatkan ke Bawah ke Bilangan Bulat Terdekat

  4. memutar log kueri lambat mysql

  5. Persistent vs non-Persistent - Mana yang harus saya gunakan?