[解決済み] MySQLが重複したレコードを削除し、最新のレコードを保持する
2022-02-05 13:59:27
質問
私はユニークな
id
と
email
フィールドを使用します。メールが重複してしまう。重複しているメールアドレスを1つだけ残したいのですが、最新の
id
(最後に挿入されたレコード)です。
どうすれば実現できるのでしょうか?
どのように解決するのですか?
テーブルを想像してください
test
には、次のようなデータが含まれています。
select id, email
from test;
ID EMAIL
---------------------- --------------------
1 aaa
2 bbb
3 ccc
4 bbb
5 ddd
6 eee
7 aaa
8 aaa
9 eee
そこで、繰り返されるメールをすべて探し出し、最新のidを除いてすべて削除する必要があります。
この場合
aaa
,
bbb
と
eee
が繰り返されるので、ID1、7、2、6を削除したい。
これを実現するために、まず、繰り返されるメールをすべて見つける必要があります。
select email
from test
group by email
having count(*) > 1;
EMAIL
--------------------
aaa
bbb
eee
そして、このデータセットから、繰り返されるメールのそれぞれの最新IDを見つける必要があります。
select max(id) as lastId, email
from test
where email in (
select email
from test
group by email
having count(*) > 1
)
group by email;
LASTID EMAIL
---------------------- --------------------
8 aaa
4 bbb
9 eee
最後に、LASTIDより小さいIdを持つこれらの電子メールをすべて削除することができるようになりました。つまり、解決策は
delete test
from test
inner join (
select max(id) as lastId, email
from test
where email in (
select email
from test
group by email
having count(*) > 1
)
group by email
) duplic on duplic.email = test.email
where test.id < duplic.lastId;
現在、このマシンには mySql がインストールされていませんが、動作するはずです。
更新情報
上記の削除は機能しますが、より最適化されたバージョンを見つけました。
delete test
from test
inner join (
select max(id) as lastId, email
from test
group by email
having count(*) > 1) duplic on duplic.email = test.email
where test.id < duplic.lastId;
1, 7, 2, 6 というように、最も古い重複を削除していることがわかります。
select * from test;
+----+-------+
| id | email |
+----+-------+
| 3 | ccc |
| 4 | bbb |
| 5 | ddd |
| 8 | aaa |
| 9 | eee |
+----+-------+
別のバージョンでは ルネ・リモン
delete from test
where id not in (
select max(id)
from test
group by email)
関連
-
[解決済み] MySQLが重複したレコードを削除し、最新のレコードを保持する
-
[解決済み] mysqlのテーブルからユニークキーを削除する方法
-
[解決済み] dpkg: error processing package mysql-server (dependency problems)?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] SQLテーブルで重複する値を検索する
-
[解決済み] リスト内の重複を削除する
-
[解決済み] 各グループの最後のレコードを取得する - MySQL
-
[解決済み] MySQLで複数のカラムに一意制約を指定するには?
-
[解決済み] MySQLで重複する値を検索する
-
[解決済み] MySQLの重複レコードを検索する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】SQL文が動作しない-「オペランド型の衝突:dateはintと互換性がない」。
-
[解決済み】Fatal error: mysqldをrootで実行する方法は、マニュアルの「セキュリティ」セクションをお読みください。
-
[解決済み】MySQLを使用してランダムでユニークな8文字の文字列を生成する方法
-
[解決済み] SQLZOO - select from world チュートリアル #13
-
[解決済み] MySQLで日付のみのパラメータを使用してタイムスタンプの日付を比較する方法は?
-
[解決済み] mysql 拡張は非推奨で、将来的に削除されます: 代わりに mysqli か PDO を使ってください [重複] 。
-
[解決済み] whereステートメントによるmysqlの一括更新
-
[解決済み] MySQLクエリ GROUP BY 日/月/年
-
[解決済み] このMySQLエラー Incorrect column specifier for column COLUMN NAMEを回避するにはどうしたらよいですか?
-
[解決済み] MySQLで重複した行を削除する