MySQLで列の重複値の出現回数を集計・並べ替える方法
MySQLでは、GROUP BYとORDER 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による集計後の結果に対して条件を適用するためです。この点を押さえておくと、ログ分析やアンケート集計など、さまざまな場面で応用できます。
-
MySQLで列内のすべての値の下3桁の合計を取得する方法
はじめにMySQLである列に格納されたすべての値について、下3桁(末尾3桁)を抽出し、その合計を求めたい場合があります。このような処理を実現するには、集計関数SUM()と文字列関数RIGHT()を組み合わせて使用します。RIGHT()関数は文字列の右端から指定した文字数を取り出す関数で、RIGHT(列名, 3)と記述することで各値の末尾3桁を取得できます。さらにSUM()で包むことで、それらを一括して合計できる仕組みです。本記事では、実際にサンプルテーブルを作成し、データを挿入したうえで、下3桁の合計を取得するクエリの実行方法を順を追って解説します。サンプルテーブルの作成まず、CREATE T
-
MySQLで列の値をシャッフルする方法【ORDER BY RAND()の使い方】
MySQLでテーブル内のレコード(列の値)をランダムに並べ替えたい場合は、ORDER BY RAND()を使用します。この記事では、実際にテーブルを作成し、データを挿入して、シャッフルの動作を手順ごとに確認していきましょう。 1. テーブルの作成 まず、以下のコマンドでサンプル用のテーブルを作成します。 mysql> create table DemoTable1557 -> ( -> SubjectId int NOT NULL AUTO_INCREMENT PRIMARY KEY, -> SubjectName varchar(20) -&