MySQLで3つの列から重複しない値を抽出し、1つの列にまとめて表示する方法
MySQLでは、1つのクエリ内で UNION を複数回使うことで、複数の列に分かれている値を縦方向に結合し、重複を除いた値を1つの列として取得できます。本記事では、実際のテーブル作成からデータ挿入、そして目的の結果を得るまでの手順を順番に解説します。
サンプルテーブルの作成
まずは、3つの整数型の列を持つテーブルを作成します。
mysql> create table DemoTable
-> (
-> Value1 int,
-> Value2 int,
-> Value3 int
-> );
Query OK, 0 rows affected (0.69 sec)
テストデータの挿入
INSERT コマンドを使って、いくつかのレコードを挿入します。NULL を含む行も意図的に用意しています。
mysql> insert into DemoTable values(20,null,null); Query OK, 1 row affected (0.19 sec) mysql> insert into DemoTable values(20,null,null); Query OK, 1 row affected (0.11 sec) mysql> insert into DemoTable values(20,null,null); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable values(10,null,null); Query OK, 1 row affected (0.10 sec) mysql> insert into DemoTable values(80,20,100); Query OK, 1 row affected (0.09 sec) mysql> insert into DemoTable values(10,null,null); Query OK, 1 row affected (0.16 sec)
登録済みレコードの確認
SELECT 文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
実行すると、次のような結果が出力されます。
+--------+--------+--------+ | Value1 | Value2 | Value3 | +--------+--------+--------+ | 20 | NULL | NULL | | 20 | NULL | NULL | | 20 | NULL | NULL | | 10 | NULL | NULL | | 80 | 20 | 100 | | 10 | NULL | NULL | +--------+--------+--------+ 6 rows in set (0.00 sec)
3つの列から重複しない値を1列に抽出するクエリ
ここが本題です。各列を個別に SELECT し、それらを UNION で連結することで、3つの列の値を1つの列に統合できます。UNION は自動的に重複を排除するため、同じ値は1度だけ表示されます。
mysql> select *from
-> (
-> select Value1 as AllValue from DemoTable
-> union
-> select Value2 as AllValue from DemoTable
-> union
-> select Value3 as AllValue from DemoTable
-> ) tbl where AllValue IS NOT NULL
-> order by AllValue;
実行結果
このクエリを実行すると、次のような出力が得られます。
+----------+ | AllValue | +----------+ | 10 | | 20 | | 80 | | 100 | +----------+ 4 rows in set (0.00 sec)
ポイント解説
- UNION の重複除去:
UNIONはデフォルトで重複行を除外するため、DISTINCTを明示的に書く必要はありません。重複を残したい場合はUNION ALLを使用します。 - NULL の除外: サブクエリの外側で
WHERE AllValue IS NOT NULLを指定することで、NULL 値を結果から取り除いています。 - 並べ替え: 最後に
ORDER BY AllValueを付けることで、抽出した値を昇順に整列させています。
このように、UNION を活用すれば、複数の列に散らばった値を簡単に1つの列へ集約し、重複のない一覧として取得できます。正規化されていないテーブルや、集計前の前処理などで役立つテクニックなので、ぜひ覚えておきましょう。
-
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でハイフン区切りの文字列値を1つの列から複数の列に分離して選択する方法
ハイフンで区切られた文字列値を1つの列から複数の列に分離して取得したい場合、MySQLの SUBSTRING_INDEX() 関数を使用すると簡単に実現できます。ここでは、サンプルテーブルを使って具体的な手順を解説します。 サンプルテーブルの作成 まず、従業員情報を格納するテーブルを作成します。 mysql> create table DemoTable1962 ( EmployeeInformation text ); Query OK, 0 rows affected (0.00 sec) データの挿入 次に、INSERT文を使って「ID-名前-年齢」の形