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

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を組み合わせるのが基本的なアプローチです。ログ解析やランキング表示など、出現頻度を扱うさまざまな場面で応用できるテクニックなので、ぜひ覚えておきましょう。

  1. MySQLで特定の値を先頭に並べ替える方法【ORDER BY句の活用】

    MySQLで特定の値を持つレコードを検索結果の一番上に表示したい場合は、ORDER BY句に比較式を組み合わせることで実現できます。 基本構文 特定の値を先頭にソートするには、以下の構文を使用します。 SELECT *FROM yourTableName ORDER BY yourColumnName=yourValue DESC,yourIdColumnName; 構文のポイント 比較式の評価結果:「yourColumnName=yourValue」は、条件に一致すれば1、一致しなければ0を返す論理式として扱われます。 DESCによる降順ソート:降順で並べることで、評価結果が1(一致)のレ

  2. JavaでMySQLデータベースのテーブルから最後のレコードを取得する方法

    MySQLデータベースからデータを取得するには、JavaのexecuteQuery()メソッドを使用します。本記事では、テーブルに登録された最後のレコード(最新の1件)をJavaプログラムで取得する手順を、サンプルコード付きでわかりやすく解説します。1. MySQLデータベースにテーブルを作成するまず、MySQLデータベース上にテーブルを用意します。ここでは「sample」データベースに、以下のようなテーブルを作成します。mysql> create table javaGetDataDemo -> ( -> Id int NOT NULL AUTO_INCREMENT PRI