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 コマンド例外「権限が拒否されました」の解決方法

推薦する

DockerでPython環境をパッケージ化するプロセスの詳細な説明

docker パッケージング Python 環境の手順は次のとおりです。 1 pip listの下に...

すべてのホストがmysqlにアクセスできるようにする方法

1. MySQLデータベースのユーザーテーブルのレコードのHostフィールド値を%に変更します。奇妙...

VMware14 に CentOS 7 をインストールするグラフィック チュートリアル

CentOS の紹介CentOS は、Red Hat Linux が提供する無料で利用できるソースコ...

MySQLデータ移行方法とツールの分析

この記事は主にMySQLデータ移行方法とツールの分析を紹介します。サンプルコードを通じて詳細に紹介さ...

MySQL の遅いクエリの最適化方法と最適化の原則

1. 日付のサイズを比較するには、XML に渡される日付形式は 'yyyy-MM-dd...

インタラクションデザインと心理学の驚くべきつながり18選

デザイナーは心理学を理解する必要があるデザイナーが知るべき心理学という本は非常に興味深いです。まず、...

MySQLサービスを開くおよび閉じる2つの方法

方法1: cmdコマンドを使用するまず、DOS ウィンドウを開き、スタート、実行、cmd と入力しま...

テーブル適応とオーバーフローのいくつかの設定の詳細な説明

1. テーブル リセットの 2 つのプロパティ: ①border-collapse: collaps...

CSS スタイルの優先順位はどれくらい複雑ですか?

昨晩、面接の質問を見ていたら、CSS スタイルの優先順位について特に明確に説明していない人が何人かい...

フォームの「Enter」、「Submit」、「Enter != Submit」を削除する方法

「Enter != Submit」問題を実装するには、通常、「ボタンの種類」と「入力ボックスの数」か...

Linux CentOS 6.5 のアンインストール、tar、および MySQL のインストールチュートリアル

システム提供のMySQLをアンインストールする1. MySQLがシステムにインストールされているかど...

CentOS7にNginxを素早くインストールする方法を教えます

目次1. 概要2. Nginxインストールパッケージをダウンロードする3. 依存パッケージをインスト...

VueはTeleportをベースにModalコンポーネントを実装します

目次1. テレポートについて知る2. テレポートの基本的な使い方3. 最初のステップの最適化4. 第...

Vue フロントエンドと Django バックエンドを使用して、一定期間内のデータをクエリする方法

序文開発プロセスでは、すべてのデータではなく特定の期間内のデータをクエリするなど、クエリのフィルタリ...

49 個の JavaScript のヒントとコツ

目次1. js整数の演算2. ネイティブアラートを書き換えてポップアップボックスの数を記録する3. ...