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オプションを指定すれば、任意の記号で連結することも可能です。
-
MySQLで重複するタプルを検出してカウントを表示する方法
MySQLで重複するタプル(同じ値の組み合わせを持つ行)を検出し、その出現回数を表示するには、GROUP BY句とHAVING句を組み合わせて使用します。この記事では、テーブルの作成から重複検出クエリの実行まで、手順を追って解説します。 サンプルテーブルの作成 まず、デモ用のテーブルを作成します。 mysql> create table DemoTable -> ( -> Id int, -> Name varchar(20) -> ); Query OK, 0 rows affected (0.80 sec) テストデータの挿入
-
MySQLで重複する列の値を検索して表示する方法(GROUP BY HAVING句の使い方)
MySQLでテーブル内の重複データを検索したい場面は多くあります。例えば、登録データの重複チェックやデータクレンジングなどが挙げられます。このような場合には、GROUP BY句とHAVING句を組み合わせることで、簡単に重複する列の値を抽出できます。 重複検出の基本的な考え方 GROUP BY句で列の値ごとにレコードをグループ化し、HAVING句で「同じ値が2件以上存在するグループ」だけを絞り込むことで、重複している値だけを取り出すことができます。 サンプルテーブルの作成 まず、検証用のテーブルを作成します。 mysql> create table DemoTable1858