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

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()とサブクエリを組み合わせることで、「同じ出現回数を持つ値をひとまとめに表示する」という集計が簡単に実現できます。重複データの分析や、出現頻度の分布を確認したい場合に、ぜひ活用してみてください。

  1. MySQLで選択した行のサイズを取得する方法|CHAR_LENGTH()関数の使い方

    MySQLで選択した行のサイズを取得する方法MySQLで選択した行のサイズ(文字数)を取得するには、CHAR_LENGTH()関数を使用します。この関数は文字列の長さを返すため、SUM()関数と組み合わせることで、複数行にわたる合計サイズを簡単に算出できます。ここでは、実際にテーブルを作成しながら手順を詳しく解説していきます。ステップ1:テーブルを作成するまず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable1612    -> (    -> Fi

  2. 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