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

MySQLで列の重複値の出現回数を集計・並べ替える方法

MySQLでは、GROUP BYORDER BY DESCを組み合わせることで、列に含まれる重複値(繰り返し値)ごとの出現回数を簡単に集計できます。この記事では、実際にテーブルを作成しながら、その手順をわかりやすく解説します。

1. サンプルテーブルの作成

まずは、投稿メッセージを格納するサンプルテーブルを作成しましょう。以下のようにCREATE TABLE文を実行します。

mysql> create table DemoTable
    -> (
    -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> PostMessage varchar(100)
    -> );
Query OK, 0 rows affected (0.69 sec)

ここでは、自動採番される主キー「Id」と、メッセージ本文を保存する「PostMessage」列を持つテーブルを定義しています。

2. テストデータの挿入

次に、INSERT文を使っていくつかのレコードを挿入します。意図的に同じ値を複数回登録している点に注目してください。

mysql> insert into DemoTable(PostMessage) values('Hi');
Query OK, 1 row affected (0.14 sec)

mysql> insert into DemoTable(PostMessage) values('Hello');
Query OK, 1 row affected (0.16 sec)

mysql> insert into DemoTable(PostMessage) values('Hi');
Query OK, 1 row affected (0.12 sec)

mysql> insert into DemoTable(PostMessage) values('Awesome');
Query OK, 1 row affected (0.18 sec)

mysql> insert into DemoTable(PostMessage) values('Hello');
Query OK, 1 row affected (0.19 sec)

mysql> insert into DemoTable(PostMessage) values('Hi');
Query OK, 1 row affected (0.09 sec)

mysql> insert into DemoTable(PostMessage) values('Awesome');
Query OK, 1 row affected (0.33 sec)

この時点で、「Hi」が3件、「Hello」が2件、「Awesome」が2件登録されている状態になります。

3. 登録データの確認

SELECT文ですべてのレコードを表示し、テーブルの中身を確認してみましょう。

mysql> select *from DemoTable;

実行結果

+----+-------------+
| Id | PostMessage |
+----+-------------+
|  1 | Hi          |
|  2 | Hello       |
|  3 | Hi          |
|  4 | Awesome     |
|  5 | Hello       |
|  6 | Hi          |
|  7 | Awesome     |
+----+-------------+
7 rows in set (0.00 sec)

4. 重複値ごとの出現回数を多い順に取得する

いよいよ本題です。GROUP BYでPostMessageごとにグループ化し、COUNT()関数で件数を数え、さらにORDER BY 〜 DESCで出現回数の降順に並べ替えます。

mysql> select PostMessage,count(Id) from DemoTable group by PostMessage
    -> order by count(Id) DESC;

実行結果

+-------------+-----------+
| PostMessage | count(Id) |
+-------------+-----------+
| Hi          | 3         |
| Hello       | 2         |
| Awesome     | 2         |
+-------------+-----------+
3 rows in set (0.00 sec)

これにより、最も多く出現した値が先頭に表示され、各値の出現回数が一目で把握できるようになります。「Hi」が3回で最多であることが確認できましたね。

5. 最も多い値だけを抽出したい場合

出現回数が最も多いレコードのみを取得したい場合は、HAVING句を使って条件を絞り込みます。以下の例では、出現回数が2より大きい(つまり3回以上の)グループだけを対象にしています。

mysql> select PostMessage,count(Id) from DemoTable group by PostMessage having count(Id) > 2;

実行結果

+-------------+-----------+
| PostMessage | count(Id) |
+-------------+-----------+
| Hi          | 3         |
+-------------+-----------+
1 row in set (0.00 sec)

まとめ

GROUP BY + COUNT()の組み合わせで列内の重複値を集計でき、ORDER BY DESCで多い順に並べ替え、さらにHAVING句を使えば特定の閾値以上のグループだけを絞り込めます。なお、WHERE句ではなくHAVING句を使用するのは、GROUP BYによる集計後の結果に対して条件を適用するためです。この点を押さえておくと、ログ分析やアンケート集計など、さまざまな場面で応用できます。

  1. MySQLで列内のすべての値の下3桁の合計を取得する方法

    はじめにMySQLである列に格納されたすべての値について、下3桁(末尾3桁)を抽出し、その合計を求めたい場合があります。このような処理を実現するには、集計関数SUM()と文字列関数RIGHT()を組み合わせて使用します。RIGHT()関数は文字列の右端から指定した文字数を取り出す関数で、RIGHT(列名, 3)と記述することで各値の末尾3桁を取得できます。さらにSUM()で包むことで、それらを一括して合計できる仕組みです。本記事では、実際にサンプルテーブルを作成し、データを挿入したうえで、下3桁の合計を取得するクエリの実行方法を順を追って解説します。サンプルテーブルの作成まず、CREATE T

  2. MySQLで列の値をシャッフルする方法【ORDER BY RAND()の使い方】

    MySQLでテーブル内のレコード(列の値)をランダムに並べ替えたい場合は、ORDER BY RAND()を使用します。この記事では、実際にテーブルを作成し、データを挿入して、シャッフルの動作を手順ごとに確認していきましょう。 1. テーブルの作成 まず、以下のコマンドでサンプル用のテーブルを作成します。 mysql> create table DemoTable1557 -> ( -> SubjectId int NOT NULL AUTO_INCREMENT PRIMARY KEY, -> SubjectName varchar(20) -&