【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句で条件を絞り込むのが基本のアプローチです。ログデータの分析や重複チェックなど、さまざまな場面で活用できるテクニックなので、ぜひ覚えておきましょう。
-
JavaでMySQLテーブルのカラム数を取得・カウントする方法
MySQLテーブルのカラム(列)数をJavaで取得するには、ResultSetMetaDataインターフェースを使用します。ResultSetMetaDataを活用すれば、カラムの総数だけでなく、各カラムの名前やデータ型といった詳細情報も簡単に取得できます。前提:サンプルテーブルの作成まずは動作確認用のテーブルを作成しましょう。以下のSQLでは、3つのカラムを持つ「DemoTable」を作成しています。mysql> create table DemoTable -> ( -> St
-
MySQLで1つ以上の列の値が完全に一致する行を検索する方法
MySQLで、1つ以上の列の値が完全に一致する行(重複データ)を検索したい場合は、GROUP BY と HAVING をサブクエリと組み合わせて使用するのが効果的です。この記事では、実際の例を通じてその手順をわかりやすく解説します。 サンプルテーブルの作成 まず、デモ用のテーブルを作成しましょう。 mysql> create table DemoTable1861 ( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, Name va