MySQLデータベースは重複データを削除し、メソッドインスタンスを1つだけ保持します

MySQLデータベースは重複データを削除し、メソッドインスタンスを1つだけ保持します

1. 問題の紹介

ユーザー テーブルに 3 つのフィールドが含まれているシナリオを想定します。 id、identity_id、名前。現在、ID 番号 identity_id と名前 name には重複したデータが多数存在しており、これらを削除する必要があり、有効なデータは 1 つだけ保持されます。

2. シミュレーション環境

1. MySQLデータベースにログインし、別のテストデータベースmysql_exerciseを作成します。

データベース mysql_exercise を作成します。文字セットは utf8 です。

2. ユーザーテーブルusersを作成する

テーブルユーザーを作成する(
					id int auto_increment 主キー、
					アイデンティティID varchar(20)
					名前varchar(20) nullではない
     );

3. テストデータを挿入する

ユーザーのvalues(0,'620616199409206512','张三')に挿入します。
						(0,'620616199409206512','张三'),
						(0,'62062619930920651X','李思'),
						(0,'62062619930920651X','李思'),
						(0,'620622199101206211','王五'),
						(0,'620622199101206211','王五'),
						(0,'322235199909116233','赵六');

これを複数回実行すると、より多くの重複データが生成されます。

4. 解決策

(1)ID番号と氏名でグループ化する。

(2)グループ化後の最大ID(または最小ID)を取得する。

(3)最大(または最小)ID以外のすべてのフィールドを削除します。

5.最初の試み(失敗!!!)

ID が含まれないユーザーから削除します (identity_id、name によってユーザー グループから max(id) を選択します)。

エラー:

1093 (HY000): FROM句で更新のターゲットテーブル「users」を指定することはできません

MYSQL では、最初にテーブルのレコードを選択し、次に同じ条件に従って同じテーブルのレコードを更新または削除することはできないためです。

解決策としては、エラーを回避するために、中間テーブルを介して再度 select によって得られた結果を選択することです。

この問題は MySQL でのみ発生し、MSSQL や Oracle では発生しません。

したがって、最初に括弧内の SQL ステートメントを取り出して、最大 (または最小) ID を最初に見つけることができます。

max_id を選択 (users グループから、identity_id、name によって max_id として max(id) を選択)。

すると、別のエラーが報告されました。 ! !

エラー 1248 (42000): すべての派生テーブルには独自のエイリアスが必要です

つまり、プロンプトには、各派生テーブルに独自のエイリアスが必要であると表示されます。

サブクエリを実行する場合、外部クエリは内部クエリをテーブルとして扱うため、内部クエリにエイリアスを追加する必要があります。

修正を続けます:

クエリで見つかった最大 (または最小 ID) の結果を新しいテーブルとして扱い、エイリアス t を指定して、t.mix_id をクエリします。

(users グループから identity_id,name によって max(id) を max_id として選択) から t.max_id を t として選択します。

最大 (または最小) ID は、次のように正常に見つかります。

6. 2回目の試み(成功!!!)

ID が含まれないユーザーから削除 (
		t.max_idを選択 
		(users グループから、identity_id、name によって max(id) を max_id として選択) を t として
		);

実行結果:

重複データは正常に削除され、最後に追加されたレコードのみが保持されます。同様に、最初に追加されたレコードを保持することもできます(つまり、各グループ内の最小のIDを除くすべてのレコードを削除します)

3. 知識の拡張1: データの更新

その他のシナリオ: ユーザーテーブル user_info で名前が空の文字列 ("") であるユーザーのステータスを "0" に変更する

user_info を更新し、user_id が (name='' である user_info から user_id を選択) のステータスを '0' に設定します。

次のエラーも報告されました:

FROM 句で更新のターゲット テーブル 'user_info' を指定することはできません

MYSQL では、最初にテーブルのレコードを選択し、その後同じ条件に従って同じテーブルのレコードを更新または削除することはできません。解決策は、中間テーブルを介して取得された結果を再度選択して、エラーを回避することです。
以下のどちらもOKです! ! !

user_infoを更新し、user_idが'0'の状態でstatus='0'を設定します。 
	 (user_id を (user_info から user_id を選択、name = '') t1 から選択);

次の例も受け入れられますが、若干の違いがあります。エイリアスには as があってもなくてもよく、t1.user_id は内部の user_id に直接対応できます。

user_infoを更新し、user_idが'0'の状態でstatus='0'を設定します。 
	(select t1.user_id from (select user_id from user_info where name='') as t1);

3.1 ステップごとの分析

(1)次のクエリ結果を中間テーブルとして使用します。

name='' の場合、user_info から user_id を選択します。

(2)中間テーブルを結果セットとして再度クエリします。

(name='' の場合、user_id を user_info から選択) から user_id を t として選択します。

(3)データの更新

user_infoを更新し、user_idが'0'の状態でstatus='0'を設定します。 
	(user_id を (user_info から name='' の user_id を選択) から t1 として選択);

4. 拡張演習: 重複データの削除

SQL クエリを記述して、Person テーブル内の重複する電子メール アドレスをすべて削除し、ID が最も小さいものだけを保持します。

+----+------------------+
| ID | メール |
+----+------------------+
| 1 | [email protected] |
| 2 | [email protected] |
| 3 | [email protected] |
+----+------------------+

Id はこのテーブルの主キーです。

たとえば、クエリを実行すると、上記の Person テーブルは次の行を返します。

+----+------------------+
| ID | メール |
+----+------------------+
| 1 | [email protected] |
| 2 | [email protected] |
+----+------------------+

回答1:

ID が ( に含まれない Person から削除
	(からt.min_idを選択
		電子メールによる人物グループから min(Id) を min_id として選択します。
		)としてt
	);

回答2:

p1を削除 
	p1 としての人物、p2 としての人物 
		ここで、p1.Email=p2.Email かつ p1.Id > p2.Id です。

要約する

これで、MySQL データベース内の重複データを削除して 1 つだけ残す方法についての記事は終了です。MySQL 内の重複データを削除する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MyBatis バッチによる MySql データの挿入/変更/削除
  • 誤って削除されたデータを復元するための mysqlbinlog コマンドを使用した mysql の実装
  • mysql5.7.33 で誤って ibdata ファイルを削除した後にデータを回復する方法
  • MySQL の大きなテーブルで大量のデータを一括削除する方法
  • MySQLがデータの削除を推奨しない理由
  • MySQL 内の数千万のデータを一括削除する Python スクリプト
  • MySQL のデータ削除とデータ テーブル メソッドの例
  • MySQL でデータを削除してもテーブル ファイルのサイズが変更されないのはなぜですか?
  • MySQL で大量のデータ (数千万) を素早く削除するためのいくつかの実用的なソリューションの詳細な説明
  • MySQLでデータを削除してもディスク領域が解放されないのはなぜですか

<<:  簡単な手順で純粋な CSS3 で 3D 反転効果を実現

>>:  docker コマンド例外「権限が拒否されました」の解決方法

推薦する

モバイルウェブ画面適応(rem)

序文最近、フロントエンドの学習に関する以前のメモを整理したところ、モバイル Web 画面の適応 (r...

JavaScript は大容量ファイルのアップロード処理を実装します

数十 MB 程度の小さいものから 1G 以上の大きいものまで、ビデオ ファイルなどのファイルのアップ...

Linux での MySQL の文字化け問題の解決方法

プロジェクトはサーバーと対話し、post を通じてサーバー側の jsp にアクセスし、jsp はサー...

vue_drf は SMS 認証コードを実装します

目次1. 需要1. 需要2. SDKパラメータ設定1. ディレクトリ構造3. コードの実装1. バッ...

MySQLの重複排除方法

MySQLの重複排除方法【初級】繰り返しのセリフが少ないdistinctive を使用してそれらを見...

Windows Server 2008 R2 リモート デスクトップのポート 3389 を変更する方法

Windows サーバー リモート デスクトップのデフォルトのポート番号は 3389 です。職場でサ...

jQueryのチェーンプログラミングスタイルの詳細な例

チェーンプログラミングの実装原理jQuery を使用すると、開発者は常にドット構文を使用して独自のメ...

MySQL のロック待機とデッドロック問題の分析

目次序文: 1. ロック待機とデッドロックを理解する2. 現象の再発と治療要約:序文: MySQL ...

MySQLデータ復旧のさまざまな方法の概要

目次1. はじめに2. 直接回復2.1 mysqldumpバックアップの完全リカバリ2.2 xtra...

JavaScript を使用して二分探索木を実装する方法

コンピュータ サイエンスで最も一般的に使用され、議論されているデータ構造の 1 つは、二分探索木です...

データ構造 - ツリー (III): 多方向検索ツリー B ツリー、B+ ツリー

多方向探索ツリー完全二分木の高さ: O(log2N)、ここで2は対数完全なM方向探索木の高さ: O(...

HTML のキャンバスに基づくスクリーンショットのデモ

冒頭に書いた以前、Renren で JS ベースのスクリーンショット ソリューションについて説明した...

chkconfig および systemctl コマンドを使用して Linux サービスを有効または無効にする方法

これは Linux 管理者にとって重要な (そして素晴らしい) トピックなので、誰もが Linux ...

vue3.0 sfcのセットアップの変更について簡単に説明します。

目次序文標準的なSFCの書き方スクリプト設定可変露出部品の取り付け小道具カスタムイベント要約する序文...

npm 淘宝ミラー変更説明

1. トップレベルの使用法1. cnpmをインストールする npm i -g cnpm --regi...