Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tóm tắt các bản ghi chi tiết MySQL khớp theo dải địa chỉ IP - bắt buộc phải có mySQL Jedi Knight

Với cấu trúc dữ liệu hiện có của bạn, bạn có thể thực hiện đối sánh chuỗi như sau (nhưng nó không hiệu quả lắm):

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

Một cách tốt hơn sẽ là lưu trữ các dải IP của bạn dưới dạng địa chỉ mạng và độ dài tiền tố:

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;

Sau đó, nó sẽ chỉ là một trường hợp thực hiện một số so sánh bit:

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. Truy vấn MySql Thay thế NULL bằng Chuỗi trống trong Lựa chọn

  2. docker container run yêu cầu ít nhất 1 đối số

  3. Vòng qua mysql_fetch_array trong PHP

  4. JSON_MERGE_PRESERVE () - Hợp nhất nhiều tài liệu JSON trong MySQL

  5. Cài đặt MySQL-python