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

【MySQL】特定の値が3回以上出現する行の数をカウントする方法

はじめに

MySQLでは、GROUP BY句サブクエリを組み合わせることで、「特定の値が3回以上出現している値の種類数」を簡単に集計できます。本記事では、サンプルテーブルを作成しながら、具体的な手順をわかりやすく解説します。

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

まず、CREATE TABLE文でテーブルを作成します。

mysql> create table DemoTable
-> (
-> UserId int
-> );
Query OK, 0 rows affected (0.48 sec)

2. レコードの挿入

続いて、INSERTコマンドを使ってテーブルにレコードを挿入します。

mysql> insert into DemoTable values(10);
Query OK, 1 row affected (0.15 sec)

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

mysql> insert into DemoTable values(30);
Query OK, 1 row affected (0.15 sec)

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

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

mysql> insert into DemoTable values(20);
Query OK, 1 row affected (0.17 sec)

mysql> insert into DemoTable values(30);
Query OK, 1 row affected (0.15 sec)

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

mysql> insert into DemoTable values(20);
Query OK, 1 row affected (0.17 sec)

mysql> insert into DemoTable values(20);
Query OK, 1 row affected (0.11 sec)

mysql> insert into DemoTable values(40);
Query OK, 1 row affected (0.21 sec)

3. テーブルの内容を確認する

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

mysql> select *from DemoTable;

出力結果

+----------+
| UserId |
+----------+
| 10 |
| 20 |
| 30 |
| 10 |
| 10 |
| 20 |
| 30 |
| 10 |
| 20 |
| 20 |
| 40 |
+----------+
11 rows in set (0.00 sec)

全11件のレコードが登録されていることが確認できます。この中で「10」は4回、「20」は4回、「30」は2回、「40」は1回出現しています。

4. 特定の値が3回以上出現する値の数をカウントする

ここからが本題です。以下のクエリを実行すると、3回以上出現している値の種類数を取得できます。

mysql> select count(*)
-> from (select UserId, count(*) as total
-> from DemoTable group by UserId
-> )tbl
-> where total >=3;

このクエリの仕組みは以下の通りです。

  • 内部のサブクエリで、UserIdごとに出現回数をGROUP BYで集計します。
  • 外側のクエリで、集計結果のうちtotal >= 3(3回以上)の条件に合致する行数をCOUNT(*)でカウントします。

出力結果

今回のサンプルでは、値「10」と「20」がそれぞれ3回以上出現しているため、該当する値は2つとなり、結果は「2」になります。

+----------+
| count(*) |
+----------+
| 2 |
+----------+
1 row in set (0.01 sec)

補足:HAVING句を使った別の書き方

サブクエリを使わず、HAVING句を直接使うことでも同様の結果を得られます。こちらの方がシンプルで可読性が高い場合もあります。

mysql> select UserId, count(*) as total
-> from DemoTable
-> group by UserId
-> having count(*) >= 3;

このクエリを実行すると、3回以上出現している値とその出現回数の一覧が表示されます。

まとめ

MySQLで特定の値が一定回数以上出現しているかどうかを調べるには、GROUP BYで各値の出現回数を集計し、HAVING句やサブクエリ+WHERE句で条件を絞り込むのが基本のアプローチです。ログデータの分析や重複チェックなど、さまざまな場面で活用できるテクニックなので、ぜひ覚えておきましょう。

  1. JavaでMySQLテーブルのカラム数を取得・カウントする方法

    MySQLテーブルのカラム(列)数をJavaで取得するには、ResultSetMetaDataインターフェースを使用します。ResultSetMetaDataを活用すれば、カラムの総数だけでなく、各カラムの名前やデータ型といった詳細情報も簡単に取得できます。前提:サンプルテーブルの作成まずは動作確認用のテーブルを作成しましょう。以下のSQLでは、3つのカラムを持つ「DemoTable」を作成しています。mysql> create table DemoTable     -> (     -> St

  2. MySQLで1つ以上の列の値が完全に一致する行を検索する方法

    MySQLで、1つ以上の列の値が完全に一致する行(重複データ)を検索したい場合は、GROUP BY と HAVING をサブクエリと組み合わせて使用するのが効果的です。この記事では、実際の例を通じてその手順をわかりやすく解説します。 サンプルテーブルの作成 まず、デモ用のテーブルを作成しましょう。 mysql> create table DemoTable1861      (      Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,      Name va