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文で完結するため、一時テーブルが不要
- 大規模なテーブルでも比較的効率的に処理できる
実運用では、削除前に必ずバックアップを取得するか、トランザクション内で実行することをおすすめします。
-
MySQLのINSERT INTO SELECT文で別のテーブルの値を挿入する方法
あるテーブルの値を基に別のテーブルへデータを挿入したい場合は、INSERT INTO SELECT文を使用します。この構文では、SELECT文で抽出した結果セットをそのまま対象テーブルへ流し込めるため、テーブル間のデータ移行やコピーにもっとも効率的な方法の一つです。 以下の手順で、実際の動作を順番に確認していきましょう。 手順1:元となるテーブルを作成する まず、データのコピー元となるテーブル「demo82」を作成します。 mysql> create table demo82 -> (
-
MySQLで別テーブルのIDからユーザー名を取得する方法|JOINの使い方を徹底解説
MySQLでは、別々のテーブルに保存されたデータをIDをキーに関連付けて取得したい場面が多くあります。そのような場合にはJOIN(内部結合)を使うことで、複数のテーブルを結合し、目的のユーザー名を簡単に取り出すことができます。 本記事では、実際にサンプルテーブルを作成しながら、JOINクエリの書き方をステップごとに解説します。 1つ目のテーブル「demo77」を作成する まず、ユーザーID(userid)とユーザー名(username)を格納するテーブルを作成します。useridは主キーとして設定します。 mysql> create table demo77 -> (