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 コマンド例外「権限が拒否されました」の解決方法
最近、要素テーブルを使用すると、並べ替えの問題によく遭遇します。単純な並べ替えであれば、要素の公式が...
序文これは古くからの要望ですが、オンラインで解決策を探している人はまだ多く、特に検索結果の上位にラン...
1つ。 Mysql Binlog フォーマットの紹介 Mysql binlog ログには、State...
メモ帳プログラムは、HTML + CSS + JavaScript の 3 つの主要なフロントエンド...
まず、MySQL とは何かを理解しましょう。 MySQL は、スウェーデンの会社 MySQL AB ...
この記事では主に、次のように共有されるネイティブ JS 音楽プレーヤーのサンプル コードを紹介します...
目次1. 親コンポーネントが子コンポーネントに値を渡す1. 親コンポーネント.vue 2. サブコン...
フォームを送信するときに、送信前に追加のパラメータが追加される状況が発生する場合があります。この問題...
目次序文1. 基本データ2. 継承駆動設計3. 左右の値のエンコーディングに基づく設計4. ツリー構...
あなたはこの質問について考えたことがあるでしょうか?デュアルアクティブが構成されている場合、データル...
目次シーン紹介深い応答性トリガーゲッターDep.targetを探すゲッターセッター要約するシーン紹介...
最近のビジネスでは、オンライン トレーニング システムが特定のオンライン プレビュー ページに対する...
<br />どの家庭にもそれぞれの問題があり、改訂はどの IT 企業にとっても問題の 1...
初心者が div+css を開発する場合、.ggg、#ccc などの形式の CSS 疑似クラス名を付...
目次1. データベースの制約1.1 はじめに1.2 制約の種類1.3 ヌルでない1.4 ユニーク1....