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

MySQLで列内に最も多く出現する上位10個の値をカウントする方法

MySQLである列の中に最も多く出現する値(最頻値)を調べたい場面はよくあります。例えば、アンケートの回答傾向やログデータの分析などです。そんなときは、GROUP BY句とCOUNT(*)ORDER BY句、そしてLIMIT句を組み合わせることで、出現回数の多い順に上位10件の値を簡単に取得できます。

基本構文

SELECT yourColumnName, count(*)
    FROM yourTableName
    GROUP BY yourColumnName
    ORDER BY count(*) DESC
    LIMIT 10;

各句の役割は以下の通りです。

  • GROUP BY: 同じ値を持つ行をグループ化します
  • COUNT(*): 各グループ(値)の出現回数を数えます
  • ORDER BY count(*) DESC: 出現回数の多い順(降順)に並べ替えます
  • LIMIT 10: 結果を上位10件に絞ります

それでは、実際にサンプルテーブルを作成して動きを確認してみましょう。

サンプルテーブルの作成

まずはテーブルを作成します。以下のクエリを実行してください。

mysql> create table countTop10Demo
    -> (
    -> Value int
    -> );
Query OK, 0 rows affected (0.74 sec)

データの挿入

次に、INSERT文を使ってテスト用のレコードを挿入していきます。

mysql> insert into countTop10Demo values(10);
Query OK, 1 row affected (0.12 sec)
mysql> insert into countTop10Demo values(1100);
Query OK, 1 row affected (0.11 sec)
mysql> insert into countTop10Demo values(200);
Query OK, 1 row affected (0.11 sec)
mysql> insert into countTop10Demo values(2100);
Query OK, 1 row affected (0.10 sec)
mysql> insert into countTop10Demo values(1100);
Query OK, 1 row affected (0.11 sec)
mysql> insert into countTop10Demo values(450);
Query OK, 1 row affected (0.28 sec)
mysql> insert into countTop10Demo values(600);
Query OK, 1 row affected (0.12 sec)
mysql> insert into countTop10Demo values(2100);
Query OK, 1 row affected (0.16 sec)
mysql> insert into countTop10Demo values(150);
Query OK, 1 row affected (0.16 sec)
mysql> insert into countTop10Demo values(16454);
Query OK, 1 row affected (0.10 sec)
mysql> insert into countTop10Demo values(450);
Query OK, 1 row affected (0.12 sec)
mysql> insert into countTop10Demo values(2350);
Query OK, 1 row affected (0.10 sec)
mysql> insert into countTop10Demo values(1780);
Query OK, 1 row affected (0.15 sec)
mysql> insert into countTop10Demo values(1345);
Query OK, 1 row affected (0.22 sec)
mysql> insert into countTop10Demo values(34);
Query OK, 1 row affected (0.15 sec)
mysql> insert into countTop10Demo values(2100);
Query OK, 1 row affected (0.08 sec)
mysql> insert into countTop10Demo values(19034);
Query OK, 1 row affected (0.12 sec)
mysql> insert into countTop10Demo values(1844);
Query OK, 1 row affected (0.11 sec)
mysql> insert into countTop10Demo values(34);
Query OK, 1 row affected (0.08 sec)
mysql> insert into countTop10Demo values(16454);
Query OK, 1 row affected (0.19 sec)

登録されたデータの確認

SELECT文ですべてのレコードを表示してみましょう。

mysql> select *from countTop10Demo;

実行結果は以下の通りです。合計20件のレコードが登録されています。

+-------+
| Value |
+-------+
| 10    |
| 1100  |
| 200   |
| 2100  |
| 1100  |
| 450   |
| 600   |
| 2100  |
| 150   |
| 16454 |
| 450   |
| 2350  |
| 1780  |
| 1345  |
| 34    |
| 2100  |
| 19034 |
| 1844  |
| 34    |
| 16454 |
+-------+
20 rows in set (0.00 sec)

出現回数の多い上位10個の値を取得するクエリ

それでは、本題である「最も多く出現する上位10個の値」を取得するクエリを実行します。

mysql> SELECT Value, count(*)
   -> FROM countTop10Demo
   -> GROUP BY Value
   -> ORDER BY count(*) DESC
   -> LIMIT 10;

実行結果は以下の通りです。

+-------+----------+
| Value | count(*) |
+-------+----------+
| 2100  | 3        |
| 1100  | 2        |
| 34    | 2        |
| 450   | 2        |
| 16454 | 2        |
| 1780  | 1        |
| 200   | 1        |
| 1345  | 1        |
| 19034 | 1        |
| 600   | 1        |
+-------+----------+
10 rows in set (0.00 sec)

結果のポイント

この結果から、「2100」が3回で最も多く出現し、「1100」「34」「450」「16454」がそれぞれ2回ずつ出現していることがわかります。同率の場合の並び順は保証されないため、必要に応じてValueなどの別カラムを第2ソートキーとしてORDER BYに追加するとよいでしょう。また、上位20件や30件を取得したい場合は、LIMITの数値を変更するだけで対応できます。


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

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

  2. 【MySQL】SUM()関数を使って単一クエリで特定の列値ごとの複数カウントを取得する方法

    特定の列値に基づくカウントを1つのMySQLクエリで複数取得するには、集計関数SUM()を活用します。MySQLでは「列 = 値」という条件式が真なら1、偽なら0を返すため、その結果をSUM()で合計することで、条件に一致する行数を数えられます。まずはサンプル用のテーブルを作成しましょう。 mysql> create table DemoTable1790 ( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, Name varchar(20), Score int ); Query OK, 0 rows af