MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLで重複する値をまとめて整形しながらデータを取得する最も効率的な方法

MySQLでは、GROUP_CONCAT() 関数を使うことで、同じ値(重複する値)を持つ複数のレコードを1行にまとめ、カンマ区切りなどの読みやすい形式に整形して取得できます。ここでは、実際のサンプルを使って手順を順番に解説します。

1. サンプルテーブルを作成する

まず、学生名と学習タイトルを格納するテーブルを作成します。

mysql> create table DemoTable1561
    -> (
    -> StudentName varchar(20),
    -> Title text
    -> );
Query OK, 0 rows affected (0.60 sec)

2. レコードを挿入する

INSERT文を使って、いくつかのレコードを登録します。ここでは「Adam」が2件存在する点に注目してください。

mysql> insert into DemoTable1561 values('Adam','Learning Java');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable1561 values('Bob','Learning C');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1561 values('Adam','Learning Spring and Hibernate Framework');
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable1561 values('Carol','Learning MySQL from basic');
Query OK, 1 row affected (0.30 sec)

3. 登録したデータを確認する

SELECT文ですべてのレコードを表示してみましょう。

mysql> select * from DemoTable1561;

実行すると、次のような出力が得られます。

+-------------+-----------------------------------------+
| StudentName | Title                                     |
+-------------+-----------------------------------------+
| Adam        | Learning Java                           |
| Bob         | Learning C                             |
| Adam        | Learning Spring and Hibernate Framework |
| Carol       | Learning MySQL from basic              |
+-------------+-----------------------------------------+
4 rows in set (0.00 sec)

4. GROUP_CONCAT()でデータを整形して取得する

次のクエリを実行すると、StudentNameごとにTitleをカンマ区切りで連結した形でデータを取得できます。

mysql> select StudentName,group_concat(Title separator ',') as FormattedOutput from DemoTable1561
    -> group by StudentName;

実行結果は以下のとおりです。「Adam」の2件のレコードが1行にまとまっていることがわかります。

+-------------+-------------------------------------------------------+
| StudentName | FormattedOutput                                     |
+-------------+-------------------------------------------------------+
| Adam        | Learning Java,Learning Spring and Hibernate Framework |
| Bob         | Learning C                                       |
| Carol       | Learning MySQL from basic                        |
+-------------+-------------------------------------------------------+
3 rows in set (0.00 sec)

ポイントのまとめ

  • GROUP_CONCAT():グループ内の複数の値を1つの文字列に連結できる集計関数です。
  • separator:区切り文字を指定できます。デフォルトはカンマ「,」ですが、「separator ' / '」のように任意の区切り文字へ変更可能です。
  • GROUP BY:StudentNameでグループ化することで、同名の学生の学習タイトルが1行に集約されます。
  • 大量データを扱う場合は、システム変数 group_concat_max_len(デフォルトは1024バイト)の上限に注意が必要です。必要に応じて値を引き上げてください。
  1. MySQLで重複する値ごとのレコードを別の列に合計して表示する方法

    MySQLでは、重複している値(同じ名前など)を持つ複数のレコードの数値を、名前ごとにまとめて合計したいケースがあります。このような場合には、集計関数SUM()とGROUP BY句を組み合わせることで簡単に実現できます。本記事では、実際にサンプルテーブルを作成し、重複する値を持つレコードを別の列(合計列)として集計・表示する手順を解説します。1. サンプルテーブルを作成するまず、CREATE TABLE文を使ってテーブルを作成します。mysql> create table DemoTable -> ( -> Name varchar(20), -> V

  2. MySQLで条件に応じて同じ列の2つの値を連結する方法

    MySQLで条件に応じて同じ列の2つの値を連結する方法 MySQLでは、max() などの集計関数と CASE 式を組み合わせることで、条件の異なる同じ列の値を1つの文字列として連結できます。この記事では、サンプルテーブルを作成しながら、具体的な手順をわかりやすく解説します。 1. サンプルテーブルの作成 まず、create table コマンドでテーブルを作成しましょう。 mysql> create table DemoTable1869     (     Id int,   &nb