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) を選択します)。 エラー:
MYSQL では、最初にテーブルのレコードを選択し、次に同じ条件に従って同じテーブルのレコードを更新または削除することはできないためです。 解決策としては、エラーを回避するために、中間テーブルを介して再度 select によって得られた結果を選択することです。 この問題は MySQL でのみ発生し、MSSQL や Oracle では発生しません。 したがって、最初に括弧内の SQL ステートメントを取り出して、最大 (または最小) ID を最初に見つけることができます。 max_id を選択 (users グループから、identity_id、name によって max_id として max(id) を選択)。 すると、別のエラーが報告されました。 ! !
つまり、プロンプトには、各派生テーブルに独自のエイリアスが必要であると表示されます。 サブクエリを実行する場合、外部クエリは内部クエリをテーブルとして扱うため、内部クエリにエイリアスを追加する必要があります。 修正を続けます: クエリで見つかった最大 (または最小 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' に設定します。 次のエラーも報告されました:
MYSQL では、最初にテーブルのレコードを選択し、その後同じ条件に従って同じテーブルのレコードを更新または削除することはできません。解決策は、中間テーブルを介して取得された結果を再度選択して、エラーを回避することです。 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 をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: 簡単な手順で純粋な CSS3 で 3D 反転効果を実現
>>: docker コマンド例外「権限が拒否されました」の解決方法
会社の要件により、異なる場所にある 2 つの nginx サーバーを同じマシンにインストールする必要...
一つの環境Alibaba Cloud Server: CentOS 7.4 64 ビット (RedH...
Alibaba Cloud Image Repositoryを使用して外部イメージをダウンロードする...
前回の記事「Docker コンテナの UID と GID を理解する」では、Docker コンテナ内...
目次MySQL の基本的な共通コマンド1. SQL文2. テーブルを作成する3. フィールドのプロパ...
この記事では、クリック時にサブメニューを表示するためのJavaScriptの具体的なコードを参考まで...
効果(ソースコードは最後にあります): 成し遂げる: 1. タグを定義します。 <h1>...
目次1. トリガーとは何ですか? 2. トリガーを作成するトリガーを作成するための構文は次のとおりで...
Crontab は定期的な実行を設定するために使用されるコマンドです。そのデーモン プロセスは cr...
後悔を癒す薬は世の中にある、考えてみる気さえあれば!コンテナを再作成する必要はもうありません。 m2...
1. 切断理由WebSocket が切断される理由は多数あります。WebSocket が切断されたと...
JavaScript の hasOwnProperty() メソッドは、Object のプロトタイ...
1. 効果を達成する 2 知識ポイント2.1 <label> タグHTML では、<...
質問があります。Dreamweaver で、3 行 1 列のログイン フォーム (ログイン、登録、パ...
1. まず、TomcatログのエンコーディングとIdeaログ表示コンソールのエンコーディングを区別す...