sql >> データベース >  >> RDS >> Mysql

IPアドレス範囲で一致するMySQL詳細レコードの要約-mySQLJediKnightが必要

    既存のデータ構造を使用して、次のように文字列照合を行うことができます(ただし、あまり効率的ではありません):

    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. AccessのODBCリンクテーブルへの一括INSERTのパフォーマンスを向上させる方法は?

    2. 階層SQLの質問

    3. アクティビティにカスタムアダプタを追加して、リストをアクティビティに表示するにはどうすればよいですか?

    4. ホームステッド-データベースに接続しています