MySQLのINET_ATON()関数とORDER BYでIPアドレスを正しく並べ替える方法
MySQLでIPアドレス形式のレコードを正しい順序で並べ替えたい場合は、INET_ATON() 関数を使用します。この関数を使うと、文字列として保存されたIPアドレスを数値に変換できるため、その結果に対して ORDER BY を適用することで、人間が直感的に理解できる自然な順序(昇順・降順)でレコードをソートできます。
1. テーブルの作成
まず、サンプル用のテーブルを作成します。
mysql> create table DemoTable
-> (
-> IpAddress varchar(50)
-> );
Query OK, 0 rows affected (1.36 sec)
2. レコードの挿入
INSERTコマンドを使って、テーブルにいくつかのIPアドレスを登録します。
mysql> insert into DemoTable values('192.168.110.78');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('192.168.110.87');
Query OK, 1 row affected (0.27 sec)
mysql> insert into DemoTable values('192.168.110.75');
Query OK, 1 row affected (0.26 sec)3. 登録データの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
実行すると、次のような結果が得られます。
+----------------+
| IpAddress |
+----------------+
| 192.168.110.78 |
| 192.168.110.87 |
| 192.168.110.75 |
+----------------+
3 rows in set (0.00 sec)
このように、通常の状態では挿入した順序のまま表示され、IPアドレスとしての大小関係は反映されていません。
4. INET_ATON()を使った並べ替え
ここで、INET_ATON()関数を組み合わせたORDER BY句を使用して、IPアドレスの昇順に並べ替えます。
mysql> select *from DemoTable
-> order by inet_aton(IpAddress);
実行結果は以下の通りです。
+----------------+
| IpAddress |
+----------------+
| 192.168.110.75 |
| 192.168.110.78 |
| 192.168.110.87 |
+----------------+
3 rows in set (0.00 sec)
ポイント解説
IPアドレスを単純に文字列としてORDER BYすると、「192.168.110.10」が「192.168.110.9」より前に来るなど、意図しない順序になることがあります。これは文字列比較では先頭から1文字ずつ評価されるためです。INET_ATON()は「192.168.110.75」のようなドット区切りのアドレスを32ビット整数に変換するため、数値として正確な比較が可能になります。降順にしたい場合は、末尾に DESC を付けるだけで対応できます。
-
MySQLでレコードを挿入しながら日付をフォーマットする方法(DATE_FORMAT活用)
MySQLでは、INSERT文の中でDATE_FORMAT()関数を使うことで、レコードを挿入する際に日付を任意の形式に整形できます。本記事では、実際にテーブルを作成し、日付をフォーマットしながらデータを挿入する手順を具体的なSQL例とともに解説します。1. テーブルの作成まず、フォーマット済みの日付文字列を格納するためのテーブルを作成します。ここでは、VARCHAR型のカラム「ShippingDate」を持つシンプルなテーブルを用意します。mysql> create table DemoTable2012 -> ( -> ShippingDate varch
-
MySQLでASC順にレコードのリストのみを表示する方法
MySQLでレコードを特定の順序で表示したい場合、条件を設定した上でORDER BY句を使用する必要があります。このようなケースでは、ORDER BY CASEステートメントが非常に便利です。本記事では、特定のレコードを優先的に並べ替えつつ、残りのレコードを昇順(ASC)で表示する方法を解説します。テーブルの作成まず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable2039 -> ( -> Name varchar(20) -> );Query OK, 0 rows affected (0.62 sec)