MySQLでGROUP BYの結果を行数(出現回数)ごとにグループ化する方法
MySQLでGROUP BYの結果を行数(出現回数)ごとにグループ化したい場合は、GROUP_CONCAT()関数を活用すると便利です。この記事では、実際にテーブルを作成しながら、その具体的な手順をサンプルコードとともにわかりやすく解説します。
1. サンプルテーブルを作成する
まず、動作確認用のテーブル「groupByDemo」を作成します。以下のCREATE TABLE文を実行してください。
mysql> create table groupByDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> Name varchar(100)
-> );
Query OK, 0 rows affected (1.31 sec)
このテーブルは、自動採番される「Id」と氏名を格納する「Name」の2つのカラムを持つシンプルな構造です。
2. テストデータを挿入する
続いて、INSERT文を使って複数のレコードを挿入します。意図的に同じ名前を複数回登録している点に注目してください。
mysql> insert into groupByDemo(Name) values('John');
Query OK, 1 row affected (0.19 sec)
mysql> insert into groupByDemo(Name) values('Carol');
Query OK, 1 row affected (0.14 sec)
mysql> insert into groupByDemo(Name) values('Carol');
Query OK, 1 row affected (0.10 sec)
mysql> insert into groupByDemo(Name) values('Bob');
Query OK, 1 row affected (0.24 sec)
mysql> insert into groupByDemo(Name) values('Bob');
Query OK, 1 row affected (0.23 sec)
mysql> insert into groupByDemo(Name) values('Bob');
Query OK, 1 row affected (0.17 sec)
mysql> insert into groupByDemo(Name) values('John');
Query OK, 1 row affected (0.16 sec)
mysql> insert into groupByDemo(Name) values('John');
Query OK, 1 row affected (0.07 sec)
mysql> insert into groupByDemo(Name) values('John');
Query OK, 1 row affected (0.11 sec)
mysql> insert into groupByDemo(Name) values('Sam');
Query OK, 1 row affected (0.17 sec)
mysql> insert into groupByDemo(Name) values('Carol');
Query OK, 1 row affected (0.19 sec)
3. 登録されたデータを確認する
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from groupByDemo;
実行結果は以下のとおりです。
+----+-------+
| Id | Name |
+----+-------+
| 1 | John |
| 2 | Carol |
| 3 | Carol |
| 4 | Bob |
| 5 | Bob |
| 6 | Bob |
| 7 | John |
| 8 | John |
| 9 | John |
| 10 | Sam |
| 11 | Carol |
+----+-------+
11 rows in set (0.00 sec)
合計11件のレコードが登録されています。「John」は4回、「Carol」と「Bob」はそれぞれ3回、「Sam」は1回出現しています。
4. 行数ごとにグループ化するクエリ
それでは本題です。以下のクエリを実行すると、出現回数ごとにレコードをグループ化できます。
mysql> SELECT Counter, GROUP_CONCAT(Name SEPARATOR ', ') as AllName
-> FROM (SELECT Name, COUNT(Name) as Counter
-> FROM groupByDemo
-> GROUP BY Name) tbl
-> GROUP BY Counter
-> ORDER BY Counter DESC;
実行結果は次のとおりです。
+---------+------------+
| Counter | AllName |
+---------+------------+
| 4 | John |
| 3 | Carol, Bob |
| 1 | Sam |
+---------+------------+
3 rows in set (0.00 sec)
クエリの仕組み
このクエリは、次のような流れで処理されます。
- サブクエリ部分:NameごとにCOUNT(Name)で出現回数(Counter)を集計します。
- 外側のクエリ:そのCounterの値ごとに再度GROUP BYを行い、同じ回数の名前をGROUP_CONCAT()でカンマ区切り(SEPARATOR ', ')の文字列として連結します。
- ORDER BY Counter DESC:出現回数の多い順に結果を並べ替えます。
このように、GROUP_CONCAT()とサブクエリを組み合わせることで、「同じ出現回数を持つ値をひとまとめに表示する」という集計が簡単に実現できます。重複データの分析や、出現頻度の分布を確認したい場合に、ぜひ活用してみてください。
-
MySQLで選択した行のサイズを取得する方法|CHAR_LENGTH()関数の使い方
MySQLで選択した行のサイズを取得する方法MySQLで選択した行のサイズ(文字数)を取得するには、CHAR_LENGTH()関数を使用します。この関数は文字列の長さを返すため、SUM()関数と組み合わせることで、複数行にわたる合計サイズを簡単に算出できます。ここでは、実際にテーブルを作成しながら手順を詳しく解説していきます。ステップ1:テーブルを作成するまず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable1612 -> ( -> Fi
-
MySQLで行を取得する際のAND演算子とOR演算子の違いとは?
MySQLにおけるAND演算子とOR演算子の違いANDとORの違いは次の通りです。ANDは、指定された両方の条件がすべて真(true)でなければ、全体の条件が真になりません。一方、ORは、どちらか一方の条件が真であれば、全体の条件が真になります。サンプルテーブルの作成まず、以下のコマンドでテーブルを作成しましょう。mysql> create table demo70-> (-> id int not null auto_increment primary key,-> name varchar(20),-> age int-> );Query OK, 0 r