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

【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回以上の重複など、さまざまな条件に柔軟に対応できます。

  1. 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

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

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