MySQLで重複レコードを個別の値にまとめ、対応する値をカンマ区切りのリストとして表示する方法
MySQLで重複しているレコードを1つの値に集約し、それに対応する複数の値をカンマ区切りのリスト形式で表示したい場合は、GROUP_CONCAT() 関数を使用します。重複する値を除外して取得するために、DISTINCT キーワードも併用します。
まず、サンプル用のテーブルを作成しましょう。
mysql> create table DemoTable(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name varchar(40),
Score int
);
Query OK, 0 rows affected (0.53 sec)次に、INSERTコマンドを使ってテーブルにいくつかのレコードを挿入します。
mysql> insert into DemoTable(Name,Score) values('Chris',56);
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable(Name,Score) values('Robert',78);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable(Name,Score) values('Chris',56);
Query OK, 1 row affected (0.42 sec)
mysql> insert into DemoTable(Name,Score) values('Bob',89);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(Name,Score) values('Chris',56);
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable(Name,Score) values('Chris',57);
Query OK, 1 row affected (0.13 sec)SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
以下のような出力が得られます。ここでは、「Name」列に同じ名前が繰り返し現れ、「Score」列にも重複した値が含まれていることが確認できます。
+----+--------+-------+ | Id | Name | Score | +----+--------+-------+ | 1 | Chris | 56 | | 2 | Robert | 78 | | 3 | Chris | 56 | | 4 | Bob | 89 | | 5 | Chris | 56 | | 6 | Chris | 57 | +----+--------+-------+ 6 rows in set (0.00 sec)
GROUP BYとGROUP_CONCAT()を使った集約クエリ
すでにGROUP BYを使用しているテーブルから、名前ごとにスコアを集約して表示するには、以下のクエリを実行します。DISTINCTを指定することで、重複したスコアは1回だけ表示されます。
mysql> select Name, group_concat(DISTINCT Score separator ',') from DemoTable group by Name;
実行結果は以下のとおりです。
+--------+--------------------------------------------+ | Name | group_concat(DISTINCT Score separator ',') | +--------+--------------------------------------------+ | Bob | 89 | | Chris | 56,57 | | Robert | 78 | +--------+--------------------------------------------+ 3 rows in set (0.00 sec)
このように、GROUP_CONCAT()にDISTINCTを組み合わせることで、重複する「Score」の値(例:Chrisの56が3件)が自動的に除外され、各名前に対して一意なスコアだけがカンマ区切りのリスト(56,57)として表示されます。「separator ','」の部分を変更すれば、セミコロンやパイプなど、任意の区切り文字を指定することも可能です。
-
MySQLで重複しない日付(個別の値)を表示する方法
MySQLでは、datetime型のカラムから「日付のみ」を基準に重複を排除してデータを取得したいケースがよくあります。例えば、同じ日に複数の注文や出荷記録がある場合、日付単位で1件だけ取り出したいときなどです。本記事では、GROUP BYとDATE()関数を組み合わせて、重複しない日付ごとのレコードを表示する方法を解説します。 1. サンプルテーブルを作成する まず、動作確認用のテーブルを作成しましょう。ここでは、出荷日時(ShippingDate)と顧客名(CustomerName)を持つテーブルを定義します。 mysql> create table DemoTable1996 (
-
MySQLで重複するIDごとに最小値を取得する方法|MIN関数とGROUP BYの実例解説
MySQLでは、重複するIDが存在するテーブルから各IDに対応する列の最小値を取得したいケースがよくあります。例えば、同じ商品IDに対して複数の価格(float型)が登録されている場合などです。そんなときは、GROUP BY句とMIN()関数を組み合わせることで簡単に実現できます。基本構文重複IDごとの最小値を取得するには、以下のような構文を使用します。select min(対象カラム名) from テーブル名 group by グループ化するカラム名;サンプルテーブルの作成実際に動作を確認するため、まずはテーブルを作成しましょう。mysql> create table DemoTabl