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

LEFT JOINを使ってMySQLテーブルの重複データを削除する方法

はじめに

MySQLのテーブルには、意図せず重複したデータが登録されてしまうことがあります。本記事では、LEFT JOINを活用して、重複する値を効率的に削除する方法を解説します。具体的なサンプルコードとともに、手順をわかりやすく紹介します。

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

まず、デモ用のテーブルを作成します。

mysql> create table DemoTable
(
    Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    FirstName varchar(100)
);
Query OK, 0 rows affected (0.46 sec)

このテーブルは、自動採番される「Id」カラムを主キーとし、「FirstName」カラムに名前を格納するシンプルな構造です。

2. テストデータの挿入

次に、INSERT文を使ってレコードを挿入します。ここでは、意図的に重複データ(RobertとJohn)を含めています。

mysql> insert into DemoTable(FirstName) values('Chris');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable(FirstName) values('Robert');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable(FirstName) values('Robert');
Query OK, 1 row affected (0.07 sec)
mysql> insert into DemoTable(FirstName) values('John');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable(FirstName) values('John');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable(FirstName) values('Mike');
Query OK, 1 row affected (0.09 sec)

3. 現在のデータを確認

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

mysql> select *from DemoTable;

実行結果は以下の通りです。RobertとJohnがそれぞれ2件ずつ存在していることが確認できます。

+----+-----------+
| Id | FirstName |
+----+-----------+
|  1 | Chris     |
|  2 | Robert    |
|  3 | Robert    |
|  4 | John      |
|  5 | John      |
|  6 | Mike      |
+----+-----------+
6 rows in set (0.00 sec)

4. LEFT JOINを使った重複削除クエリ

それでは、LEFT JOINを使用して重複データを削除します。ポイントは、各名前グループの中で最小のId(min(Id))を保持し、それ以外のレコードを削除対象とすることです。

mysql> delete tbl from DemoTable tbl
left join(
    select min(Id) as Id, FirstName
    from DemoTable
    group by FirstName
) tbl1 ON tbl.Id = tbl1.Id AND tbl.FirstName = tbl1.FirstName
where tbl1.Id IS NULL;
Query OK, 2 rows affected (0.16 sec)

クエリの仕組み

このDELETE文の動作を分解して説明します。

  • サブクエリ部分: 「FirstName」ごとにグループ化し、各グループの最小Idを取得します。これが残すべき代表レコードです。
  • LEFT JOIN部分: 元のテーブルとサブクエリの結果を結合します。代表レコード以外は結合先が存在しないため、tbl1.IdがNULLになります。
  • WHERE句: 結合できなかったレコード(つまり重複分)だけを削除します。

5. 削除後のデータ確認

再度テーブルの中身を確認しましょう。

mysql> select *from DemoTable;

実行結果を見ると、重複データが正しく削除され、各名前が1件ずつ残っていることがわかります。

+----+-----------+
| Id | FirstName |
+----+-----------+
|  1 | Chris     |
|  2 | Robert    |
|  4 | John      |
|  6 | Mike      |
+----+-----------+
4 rows in set (0.00 sec)

まとめ

LEFT JOINとGROUP BY、MIN関数を組み合わせることで、MySQLのテーブルから重複データを安全に削除できます。この手法のメリットは以下の通りです。

  • どのレコードを残すか(最小Idなど)を明確に制御できる
  • 単一のSQL文で完結するため、一時テーブルが不要
  • 大規模なテーブルでも比較的効率的に処理できる

実運用では、削除前に必ずバックアップを取得するか、トランザクション内で実行することをおすすめします。

  1. MySQLのINSERT INTO SELECT文で別のテーブルの値を挿入する方法

    あるテーブルの値を基に別のテーブルへデータを挿入したい場合は、INSERT INTO SELECT文を使用します。この構文では、SELECT文で抽出した結果セットをそのまま対象テーブルへ流し込めるため、テーブル間のデータ移行やコピーにもっとも効率的な方法の一つです。 以下の手順で、実際の動作を順番に確認していきましょう。 手順1:元となるテーブルを作成する まず、データのコピー元となるテーブル「demo82」を作成します。 mysql> create table demo82     -> (     

  2. MySQLで別テーブルのIDからユーザー名を取得する方法|JOINの使い方を徹底解説

    MySQLでは、別々のテーブルに保存されたデータをIDをキーに関連付けて取得したい場面が多くあります。そのような場合にはJOIN(内部結合)を使うことで、複数のテーブルを結合し、目的のユーザー名を簡単に取り出すことができます。 本記事では、実際にサンプルテーブルを作成しながら、JOINクエリの書き方をステップごとに解説します。 1つ目のテーブル「demo77」を作成する まず、ユーザーID(userid)とユーザー名(username)を格納するテーブルを作成します。useridは主キーとして設定します。 mysql> create table demo77 -> (