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

MySQLのGROUP_CONCAT()とGROUP BYで重複データを検索し、1行にまとめて表示する方法

MySQLで重複しているデータを検索し、その結果を1行にまとめて表示したい場合は、GROUP_CONCAT()関数とGROUP BY句を組み合わせるのが効果的です。この2つを併用することで、重複する値ごとに関連するレコードをグループ化し、カンマ区切りの文字列として1行に連結して表示できます。

サンプルテーブルの作成

まずは、動作確認用のデモテーブルを作成しましょう。

mysql> create table DemoTable
(
    StudentFavouriteSubject varchar(40),
    StudentName varchar(40)
);
Query OK, 0 rows affected (0.75 sec)

レコードの挿入

次に、INSERT文を使ってテーブルにサンプルデータを登録します。

mysql> insert into DemoTable values('MySQL','Chris');
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable values('MongoDB','Bob');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('MySQL','Sam');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('Java','Mike');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('C','Carol');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('MongoDB','John');
Query OK, 1 row affected (0.18 sec)

登録済みレコードの確認

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

mysql> select *from DemoTable;

実行すると、以下のような結果が得られます。

+-------------------------+-------------+
| StudentFavouriteSubject | StudentName |
+-------------------------+-------------+
| MySQL                   | Chris       |
| MongoDB                 | Bob         |
| MySQL                   | Sam         |
| Java                    | Mike        |
| C                       | Carol       |
| MongoDB                 | John        |
+-------------------------+-------------+
6 rows in set (0.00 sec)

この表を見ると、「MySQL」と「MongoDB」にそれぞれ複数の学生が紐づいていることがわかります。

重複データを検索して1行にまとめるクエリ

それでは本題です。GROUP_CONCAT()とGROUP BY句を使った次のクエリを実行すると、重複する値ごとに関連するデータを1行にまとめて取得できます。

mysql> select group_concat(StudentName),StudentFavouriteSubject from DemoTable
group by StudentFavouriteSubject;

実行結果は以下の通りです。

+---------------------------+-------------------------+
| group_concat(StudentName) | StudentFavouriteSubject |
+---------------------------+-------------------------+
| Carol                     | C                       |
| Mike                      | Java                    |
| Bob,John                  | MongoDB                 |
| Chris,Sam                 | MySQL                   |
+---------------------------+-------------------------+
4 rows in set (0.00 sec)

実行結果のポイント

出力結果を見ると、「MongoDB」には「Bob,John」、「MySQL」には「Chris,Sam」のように、重複している科目ごとに該当する学生名がカンマ区切りで1行にまとめられていることがわかります。これにより、どの値が重複しており、それぞれにどんなレコードが紐づいているのかを一目で把握できます。

なお、区切り文字を変更したい場合は、GROUP_CONCAT(StudentName SEPARATOR ' / ') のようにSEPARATORオプションを指定すれば、任意の記号で連結することも可能です。

  1. MySQLで重複するタプルを検出してカウントを表示する方法

    MySQLで重複するタプル(同じ値の組み合わせを持つ行)を検出し、その出現回数を表示するには、GROUP BY句とHAVING句を組み合わせて使用します。この記事では、テーブルの作成から重複検出クエリの実行まで、手順を追って解説します。 サンプルテーブルの作成 まず、デモ用のテーブルを作成します。 mysql> create table DemoTable -> ( -> Id int, -> Name varchar(20) -> ); Query OK, 0 rows affected (0.80 sec) テストデータの挿入

  2. MySQLで重複する列の値を検索して表示する方法(GROUP BY HAVING句の使い方)

    MySQLでテーブル内の重複データを検索したい場面は多くあります。例えば、登録データの重複チェックやデータクレンジングなどが挙げられます。このような場合には、GROUP BY句とHAVING句を組み合わせることで、簡単に重複する列の値を抽出できます。 重複検出の基本的な考え方 GROUP BY句で列の値ごとにレコードをグループ化し、HAVING句で「同じ値が2件以上存在するグループ」だけを絞り込むことで、重複している値だけを取り出すことができます。 サンプルテーブルの作成 まず、検証用のテーブルを作成します。 mysql> create table DemoTable1858