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

推薦する

テーブル内の要素のドラッグと並べ替えの問題について簡単に説明します

最近、要素テーブルを使用すると、並べ替えの問題によく遭遇します。単純な並べ替えであれば、要素の公式が...

高度な CSS の 3 つの方法を使用して複数行の省略を実装するサンプル コード

序文これは古くからの要望ですが、オンラインで解決策を探している人はまだ多く、特に検索結果の上位にラン...

MySQL の 3 つの Binlog 形式の概要と分析

1つ。 Mysql Binlog フォーマットの紹介 Mysql binlog ログには、State...

JS はシンプルな todoList (メモ帳) 効果を実装します

メモ帳プログラムは、HTML + CSS + JavaScript の 3 つの主要なフロントエンド...

MySQL 5.7.20 Green Edition のインストールの詳細なグラフィックチュートリアル

まず、MySQL とは何かを理解しましょう。 MySQL は、スウェーデンの会社 MySQL AB ...

ネイティブ JS で音楽プレーヤーを実装するためのサンプル コード

この記事では主に、次のように共有されるネイティブ JS 音楽プレーヤーのサンプル コードを紹介します...

Vue 父子価値移転、兄弟価値移転、子父価値移転の詳細な説明

目次1. 親コンポーネントが子コンポーネントに値を渡す1. 親コンポーネント.vue 2. サブコン...

フォーム送信時に追加のパラメータを渡すためのいくつかの一般的な方法

フォームを送信するときに、送信前に追加のパラメータが追加される状況が発生する場合があります。この問題...

MySQL ツリー構造データベース テーブル設計

目次序文1. 基本データ2. 継承駆動設計3. 左右の値のエンコーディングに基づく設計4. ツリー構...

MySQL がデュアルマスターで構成されている場合にデータループの競合を回避する方法

あなたはこの質問について考えたことがあるでしょうか?デュアルアクティブが構成されている場合、データル...

Vue バッチ更新 DOM 実装手順

目次シーン紹介深い応答性トリガーゲッターDep.targetを探すゲッターセッター要約するシーン紹介...

Vue ページ監視ユーザープレビュー時間機能実装コード

最近のビジネスでは、オンライン トレーニング システムが特定のオンライン プレビュー ページに対する...

ウェブサイトの再設計はどの家族にとっても難しい作業です

<br />どの家庭にもそれぞれの問題があり、改訂はどの IT 企業にとっても問題の 1...

CSS疑似クラス名を数字で始めないでください

初心者が div+css を開発する場合、.ggg、#ccc などの形式の CSS 疑似クラス名を付...

MySQL データベースの制約とデータ テーブルの設計原則

目次1. データベースの制約1.1 はじめに1.2 制約の種類1.3 ヌルでない1.4 ユニーク1....