【MySQL】GROUP BYとHAVING句で同じテーブル内の共通する値を持つ行を抽出する方法
はじめに
MySQLで、同じテーブル内に登録された複数の行の中から、特定の値が繰り返し登場するデータを抽出したいケースはよくあります。たとえば、「同じIDが何度も出現しているレコードを見つけたい」といった場合です。
こうした処理には、GROUP BY句とHAVING句を組み合わせるのが効果的です。本記事では、実際のSQLコードと実行結果をもとに、その手順をわかりやすく解説します。
1. サンプルテーブルを作成する
まず、動作確認用のテーブルを作成しましょう。ここでは「Id」と「Name」の2つのカラムを持つシンプルなテーブルを用意します。
mysql> create table DemoTable1467
-> (
-> Id int,
-> Name varchar(20)
-> );
Query OK, 0 rows affected (0.64 sec)
2. テストデータを挿入する
次に、INSERT文を使ってレコードを挿入します。ポイントは、Id「100」(Name:Chris)のデータを意図的に3件重複させていることです。これにより、重複検出の動きを確認できます。
mysql> insert into DemoTable1467 values(100,'Chris');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable1467 values(110,'David');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1467 values(120,'Mike');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable1467 values(100,'Chris');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1467 values(130,'Carol');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1467 values(100,'Chris');
Query OK, 1 row affected (0.20 sec)
3. 登録されたデータを確認する
SELECT文ですべてのレコードを表示して、テーブルの中身を確認してみましょう。
mysql> select * from DemoTable1467;
実行すると、以下のような結果が得られます。
+------+-------+
| Id | Name |
+------+-------+
| 100 | Chris |
| 110 | David |
| 120 | Mike |
| 100 | Chris |
| 130 | Carol |
| 100 | Chris |
+------+-------+
6 rows in set (0.00 sec)
全6件のうち、Id「100」の「Chris」が3件登録されていることが確認できます。
4. 共通する値を持つ行を抽出するクエリ
それが本題です。以下のクエリを実行すると、同じテーブル内で繰り返し登場している値を持つ行を取得できます。
mysql> select Id,Name,count(*) as IdCount from DemoTable1467
-> group by Id
-> having IdCount > 2;
クエリのポイント:
- GROUP BY Id:Idごとに行をグループ化します。
- count(*) as IdCount:各グループの出現回数をカウントし、別名「IdCount」として扱います。
- HAVING IdCount > 2:出現回数が2回より多い(つまり3回以上)グループのみを絞り込みます。WHERE句ではなくHAVING句を使うのが重要なポイントです。
実行結果は以下の通りです。
+------+-------+---------+
| Id | Name | IdCount |
+------+-------+---------+
| 100 | Chris | 3 |
+------+-------+---------+
1 row in set (0.00 sec)
Id「100」の「Chris」が出現回数3回として正しく抽出されました。
まとめ
同じテーブル内で繰り返し登場する値を持つ行を取得したい場合は、GROUP BY句でグループ化し、HAVING句で集計結果を条件に絞り込むのが基本のアプローチです。HAVING句は集計後のデータに対して条件を適用できるため、「出現回数によるフィルタリング」などに非常に便利です。しきい値(この例では「> 2」)を変更すれば、2回以上の重複など、さまざまな条件に柔軟に対応できます。
-
MySQLでテーブルの最後から2番目のレコードを取得する方法
MySQLで最後から2番目のレコード(末尾の一つ前のレコード)を取得したい場合、サブクエリを利用します。単純に ORDER BY ... DESC LIMIT 1 を使うと最後のレコードしか取得できないため、サブクエリと組み合わせることで後ろから2番目のデータを取り出せます。基本構文SELECT * FROM (SELECT * FROM yourTableName ORDER BY yourIdColumnName DESC LIMIT 2) anyAliasName ORDER BY yourIdColumnName LIMIT 1;この構文のポイントは以下の通りです。内側のサブクエリでI
-
JavaでMySQLデータベースのテーブルから最後のレコードを取得する方法
MySQLデータベースからデータを取得するには、JavaのexecuteQuery()メソッドを使用します。本記事では、テーブルに登録された最後のレコード(最新の1件)をJavaプログラムで取得する手順を、サンプルコード付きでわかりやすく解説します。1. MySQLデータベースにテーブルを作成するまず、MySQLデータベース上にテーブルを用意します。ここでは「sample」データベースに、以下のようなテーブルを作成します。mysql> create table javaGetDataDemo -> ( -> Id int NOT NULL AUTO_INCREMENT PRI