MySQLでGROUP BYとGROUP_CONCATを使って各グループのレコード数とID一覧を1行で表示する方法
MySQLでは、GROUP_CONCAT()とCOUNT()、さらにGROUP BY句を組み合わせることで、同じ値を持つ複数のレコードを1行にまとめ、その件数と一緒に表示することができます。
本記事では、実際にテーブルを作成し、データを挿入したうえで、グループごとのレコード数とIDの一覧を取得する手順を解説します。
サンプルテーブルの作成
まず、以下のコマンドでテーブルを作成します。
mysql> create table DemoTable
-> (
-> CompanyId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> CompanyName varchar(20)
-> );
Query OK, 0 rows affected (0.62 sec)
自動採番(AUTO_INCREMENT)される主キーのCompanyId列と、会社名を格納するCompanyName列を持つシンプルなテーブルです。
レコードの挿入
次に、INSERT文を使ってレコードを追加します。検証のため、あえて重複する会社名を含めています。
mysql> insert into DemoTable(CompanyName) values('Amazon');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(CompanyName) values('Google');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable(CompanyName) values('Google');
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable(CompanyName) values('Microsoft');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable(CompanyName) values('Amazon');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(CompanyName) values('Amazon');
Query OK, 1 row affected (0.07 sec)登録データの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
実行結果は次の通りです。
+-----------+-------------+
| CompanyId | CompanyName |
+-----------+-------------+
| 1 |Amazon |
| 2 |Google |
| 3 |Google |
| 4 |Microsoft |
| 5 |Amazon |
| 6 |Amazon |
+-----------+-------------+
6 rows in set (0.00 sec)
「Amazon」が3件、「Google」が2件、「Microsoft」が1件登録されていることが確認できます。
グループごとのカウントとID一覧を表示するクエリ
それでは本題です。GROUP BY句で会社名ごとにグループ化し、COUNT()で件数を、GROUP_CONCAT()でIDの一覧を取得します。さらにHAVING句を使って、件数が2件以上のグループだけに絞り込みます。
mysql> select CompanyName,group_concat(CompanyId),count(CompanyId) as count from DemoTable
-> group by CompanyName
-> having count > 1;
実行結果は以下の通りです。
+-------------+-------------------------+-------+
| CompanyName | group_concat(CompanyId) | count |
+-------------+-------------------------+-------+
| Amazon | 1,5,6 | 3 |
| Google | 2,3 | 2 |
+-------------+-------------------------+-------+
2 rows in set (0.00 sec)
クエリのポイント解説
- GROUP BY CompanyName:同じ会社名のレコードを1つのグループにまとめます。
- COUNT(CompanyId):各グループ内のレコード数をカウントします。
- GROUP_CONCAT(CompanyId):グループ内のCompanyIdの値をカンマ区切りで連結し、1つの文字列として返します。
- HAVING count > 1:集計後の結果に対して条件を適用し、重複している(2件以上の)グループのみを抽出します。
このように、GROUP_CONCAT()とCOUNT()、GROUP BY句を組み合わせれば、重複データの確認やグループ別の集計を効率的に行えます。WHERE句ではなくHAVING句を使うのがポイントで、これは集計後の値に対して条件を指定するためです。
-
MySQLのCASE文を使ってAmount列から条件別に2種類の合計値を同時に取得する方法
MySQLでは、CASE文を活用することで、1つのクエリ内で異なる条件ごとの合計値を複数同時に算出できます。例えば、Amount(金額)列から「全体の合計」と「特定条件を満たすレコードのみの合計」を一度に表示したい場合に非常に便利です。ここでは、具体的な手順をサンプルとともに解説します。1. サンプルテーブルの作成まず、テーブルを作成します。mysql> create table DemoTable1794 ( Amount int ); Query OK, 0 rows affected (0.00 sec)2. テストデータの挿入INSERTコマンドを使って、
-
MySQLでテーブルの日付レコードを変更する方法|UPDATEとDATE_ADD()の使い方
MySQLで保存済みの日付データに年数を加算して変更したい場合、UPDATEコマンドとDATE_ADD()関数を組み合わせることで簡単に実現できます。ここでは、実際のSQLクエリ例を使いながら、日付レコードを変更する手順を順番に解説します。1. テーブルを作成するまず、日付型(date)のカラムを持つテーブルを作成します。mysql> create table DemoTable1984 ( ShippingDate date ); Query OK, 0 rows affected (0.00 sec)2. レコードを挿入する次に、INSERTコマンドを使ってテ