MySQLでIdごとに重複を除外してGROUP_CONCATするクエリの書き方
はじめに
MySQLでは、テーブル内に同じIdとNameの組み合わせが重複して登録されているケースがあります。このような場合、DISTINCTで重複行を除外したうえでGROUP_CONCAT()を適用すれば、Idによって区別された一意な値だけを連結できます。
本記事では、実際にテーブルを作成し、データを挿入してから、Idごとに重複を除外したGROUP_CONCATを実行するまでの手順を具体的に解説します。
サンプルテーブルの作成
まず、以下のCREATE TABLE文でテーブルを作成します。
mysql> create table DemoTable
(
Id int,
Name varchar(100)
);
Query OK, 0 rows affected (0.64 sec)レコードの挿入
次に、INSERTコマンドでいくつかのレコードを挿入します。ここでは、後ほど重複除外の効果を確認できるよう、あえて重複データ(Id=100のChris、Id=400のMike)を含めています。
mysql> insert into DemoTable values(100,'Chris'); Query OK, 1 row affected (0.44 sec) mysql> insert into DemoTable values(200,'Robert'); Query OK, 1 row affected (0.16 sec) mysql> insert into DemoTable values(100,'Chris'); Query OK, 1 row affected (0.15 sec) mysql> insert into DemoTable values(300,'David'); Query OK, 1 row affected (0.10 sec) mysql> insert into DemoTable values(400,'Mike'); Query OK, 1 row affected (0.10 sec) mysql> insert into DemoTable values(400,'Mike'); Query OK, 1 row affected (0.10 sec)
テーブルの内容を確認する
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
実行すると、次のような結果が出力されます。
+------+--------+ | Id | Name | +------+--------+ | 100 | Chris | | 200 | Robert | | 100 | Chris | | 300 | David | | 400 | Mike | | 400 | Mike | +------+--------+ 6 rows in set (0.00 sec)
このように、「100:Chris」と「400:Mike」がそれぞれ2件ずつ重複していることがわかります。
Idごとに区別したGROUP_CONCATの実行
重複を除外しながらNameを連結するには、サブクエリ内でDISTINCT Id, Nameを指定し、その結果セットに対してGROUP_CONCAT()を適用します。
mysql> select group_concat(Name)
from
(
select distinct Id,Name from DemoTable
)
tbl;実行結果は以下のとおりです。
+-------------------------+ | group_concat(Name) | +-------------------------+ | Chris,Robert,David,Mike | +-------------------------+ 1 row in set (0.00 sec)
クエリのポイント解説
このクエリが正しく機能する仕組みは、次の2段階に分けられます。
- サブクエリでのDISTINCT:
select distinct Id, Name from DemoTableにより、IdとNameの両方が一致する重複行が排除されます。その結果、「100:Chris」と「400:Mike」はそれぞれ1件だけ残ります。 - 外側のGROUP_CONCAT: 重複が除去された結果に対して
group_concat(Name)を実行することで、すべてのNameがデフォルトのカンマ(,)区切りで1つの文字列に連結されます。
なお、区切り文字を変更したい場合はSEPARATOR句を利用します。たとえば、スペース区切りにしたい場合は次のように記述します。
select group_concat(Name separator ' ')
from
(
select distinct Id,Name from DemoTable
) tbl;このように、サブクエリでDISTINCTを適用してからGROUP_CONCATを使うことで、Id単位で区別された重複なしの連結結果を簡単に取得できます。
-
MySQLの単一クエリで重複しないアイテム数をカウントする方法
特定の条件に合う「重複しないアイテム」の数を取得したい場合、COUNT() 関数と DISTINCT キーワードを組み合わせて使用します。DISTINCT を指定すると、重複する値が除外された一意の値だけが対象になります。本記事では、実際にテーブルを作成し、単一のクエリで異なるアイテム数をカウントする手順を解説します。 1. サンプルテーブルの作成 まず、顧客ID・顧客名・製品名を持つテーブルを作成します。 mysql> create table DemoTable ( CustomerId int, CustomerName varchar(20), Prod
-
MySQLでGROUP_CONCATの最後の値を取得する方法
MySQLでGROUP_CONCATの結果から最後の値を取り出したい場合は、SUBSTRING_INDEX()関数を使うのが最も簡単な方法です。この記事では、実際にテーブルを作成し、サンプルデータを使いながら具体的な手順を解説します。1. テーブルの作成まず、カンマ区切りの文字列を格納するテーブルを作成します。mysql> create table DemoTable1525 -> ( -> ListOfSubjects text ->