MySQLで重複する値を含むテーブルから出現回数の多い上位エントリを選択する方法
はじめに
データベースのテーブルには、同じ値が何度も登録されていることがあります。そのような場合、「どの値が最も多く出現しているのか」を調べたい場面は少なくありません。本記事では、MySQLを使って、重複する値を含むテーブルから出現回数の多い(上位の)エントリを選択する方法を、具体的な手順とともに解説します。
ステップ1:サンプルテーブルを作成する
まず、CREATE TABLE文でテーブルを作成しましょう。
mysql> create table DemoTable610 (SubjectName varchar(100)); Query OK, 0 rows affected (0.63 sec)
ここでは、科目名を格納する「SubjectName」というカラムを1つ持つシンプルなテーブルを定義しています。
ステップ2:レコードを挿入する
次に、INSERT文を使って複数のレコードを挿入します。あえて同じ科目名を繰り返し登録することで、重複データを持つテーブルを作成しています。
mysql> insert into DemoTable610 values('MySQL');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable610 values('Java');
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable610 values('MySQL');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable610 values('MongoDB');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable610 values('MySQL');
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable610 values('MySQL');
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable610 values('Java');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable610 values('MongoDB');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable610 values('C');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable610 values('C++');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable610 values('MongoDB');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable610 values('MySQL');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable610 values('Java');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable610 values('Python');
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable610 values('MySQL');
Query OK, 1 row affected (0.15 sec)ステップ3:テーブルの内容を確認する
SELECT文ですべてのレコードを表示し、データが正しく登録されているか確認しましょう。
mysql> select *from DemoTable610;
実行すると、以下のような結果が得られます。
+-------------+ | SubjectName | +-------------+ | MySQL | | Java | | MySQL | | MongoDB | | MySQL | | MySQL | | Java | | MongoDB | | C | | C++ | | MongoDB | | MySQL | | Java | | Python | | MySQL | +-------------+ 15 rows in set (0.00 sec)
合計15件のレコードが登録されており、「MySQL」「Java」「MongoDB」などが複数回出現していることがわかります。
ステップ4:出現回数の多い上位エントリを選択するクエリ
それでは本題です。GROUP BY、COUNT()、ORDER BY、LIMITを組み合わせたサブクエリを使うことで、出現回数の多いエントリだけを取り出せます。
mysql> select SubjectName from ( select SubjectName from DemoTable610 group by SubjectName order by count(SubjectName) DESC LIMIT 2 ) AS tbl order by SubjectName;
クエリの仕組み
このクエリは、内側と外側の2つの処理に分けて理解すると分かりやすくなります。
- 内側のサブクエリ:GROUP BYで科目名ごとにグループ化し、COUNT(SubjectName)でそれぞれの出現回数を集計します
- ORDER BY count(SubjectName) DESC:出現回数が多い順(降順)に並べ替えます
- LIMIT 2:上位2件のみを取得します
- 外側のクエリ:取得した結果をAS tblという別名で受け取り、今度は科目名のアルファベット順(昇順)に並べ替えて表示します
実行結果
上記のクエリを実行すると、次の出力が得られます。
+-------------+ | SubjectName | +-------------+ | Java | | MySQL | +-------------+ 2 rows in set (0.04 sec)
元のデータを数えてみると、「MySQL」が6回、「Java」が3回出現しており、この2つが出現回数の上位となっています。LIMIT句の値を変更すれば、任意の件数の上位エントリを柔軟に取得できます。
まとめ
重複する値を含むテーブルから上位のエントリを抽出するには、GROUP BYでグループ化したうえでCOUNT()による集計を行い、ORDER BY DESCとLIMITを組み合わせるのが基本的なアプローチです。ログ解析やランキング表示など、出現頻度を扱うさまざまな場面で応用できるテクニックなので、ぜひ覚えておきましょう。
-
MySQLで特定の値を先頭に並べ替える方法【ORDER BY句の活用】
MySQLで特定の値を持つレコードを検索結果の一番上に表示したい場合は、ORDER BY句に比較式を組み合わせることで実現できます。 基本構文 特定の値を先頭にソートするには、以下の構文を使用します。 SELECT *FROM yourTableName ORDER BY yourColumnName=yourValue DESC,yourIdColumnName; 構文のポイント 比較式の評価結果:「yourColumnName=yourValue」は、条件に一致すれば1、一致しなければ0を返す論理式として扱われます。 DESCによる降順ソート:降順で並べることで、評価結果が1(一致)のレ
-
JavaでMySQLデータベースのテーブルから最後のレコードを取得する方法
MySQLデータベースからデータを取得するには、JavaのexecuteQuery()メソッドを使用します。本記事では、テーブルに登録された最後のレコード(最新の1件)をJavaプログラムで取得する手順を、サンプルコード付きでわかりやすく解説します。1. MySQLデータベースにテーブルを作成するまず、MySQLデータベース上にテーブルを用意します。ここでは「sample」データベースに、以下のようなテーブルを作成します。mysql> create table javaGetDataDemo -> ( -> Id int NOT NULL AUTO_INCREMENT PRI