【MySQL】SUBSTRING_INDEXでIPアドレスのサブパートごとの重複数をカウントする方法
IPアドレスのような文字列データを部分ごとに集計したい場合、MySQLのSUBSTRING_INDEX()関数を活用するのが効果的です。この関数を使えば、区切り文字を基準に文字列を切り出し、IPアドレスのネットワーク部(上位3オクテット)だけを取り出してグループ化し、重複数を簡単にカウントできます。
テーブルの作成
まず、サンプル用のテーブルを作成しましょう。
mysql> create table DemoTable
(
SystemIpAddress text
);
Query OK, 0 rows affected (0.58 sec)
レコードの挿入
insertコマンドを使って、テーブルにいくつかのIPアドレスを登録します。
mysql> insert into DemoTable values('192.168.130.67');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable values('192.168.130.87');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('192.168.131.47');
Query OK, 1 row affected (0.31 sec)
mysql> insert into DemoTable values('192.168.134.50');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('192.168.131.12');
Query OK, 1 row affected (0.21 sec)
登録データの確認
selectステートメントで、テーブル内の全レコードを表示してみます。
mysql> select *from DemoTable ;
実行すると、次のような結果が得られます。
+-----------------+ | SystemIpAddress | +-----------------+ | 192.168.130.67 | | 192.168.130.87 | | 192.168.131.47 | | 192.168.134.50 | | 192.168.131.12 | +-----------------+ 5 rows in set (0.00 sec)
サブパートごとに重複をカウントするクエリ
IPアドレスの上位3オクテット(サブパート)ごとにレコード数を集計するクエリは以下の通りです。SUBSTRING_INDEX()の第3引数に「3」を指定することで、3つ目のドットより前の部分(例:192.168.130)を取り出し、それをGROUP BYでグループ化して件数をカウントしています。
mysql> select substring_index(tbl.SystemIpAddress, '.', 3) , count(*) as Total from DemoTable tbl
group by substring_index(tbl.SystemIpAddress, '.', 3)
order by Total desc limit 5;
実行結果は次のようになります。
+----------------------------------------------+-------+ | substring_index(tbl.SystemIpAddress, '.', 3) | Total | +----------------------------------------------+-------+ | 192.168.130 | 2 | | 192.168.131 | 2 | | 192.168.134 | 1 | +----------------------------------------------+-------+ 3 rows in set (0.00 sec)
この結果から、「192.168.130」と「192.168.131」のネットワークにはそれぞれ2件、「192.168.134」には1件のIPアドレスが登録されていることが一目でわかります。ログ解析やアクセス集計など、IPアドレスをネットワーク単位で統計処理したい場合に非常に便利なテクニックなので、ぜひ活用してみてください。
-
MySQLでNULLを含む列からNULL以外(NOT NULL)の値だけを抽出して表示する方法
MySQLのIS NOT NULLを使ってNULL以外の値のみを表示するMySQLで、NULLとNULL以外のレコードが混在する列からNULL以外の値だけを取得したい場合は、IS NOT NULL演算子を使用します。この記事では、実際にテーブルを作成しながら手順を解説します。1. テーブルの作成まず、日付型の列を持つサンプルテーブルを作成します。mysql> create table DemoTable1 ( DueDate date ); Query OK, 0 ro
-
MySQLで列の値ごとに「NO」の件数のみをカウントして返すクエリの書き方
MySQLでは、SUM()関数と条件式を組み合わせることで、グループごとに特定の値(この例では「NO」)が出現した回数だけをカウントできます。ここでは、ENUM型のカラムを持つテーブルを例に、「NO」の件数のみを集計する方法を具体的な手順とともに解説します。 1. テーブルを作成する まず、サンプル用のテーブルを作成します。isTopperカラムはENUM型で、「YES」または「NO」のいずれかの値を持ちます。 mysql> create table DemoTable1829 ( Name varchar(