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 コマンド例外「権限が拒否されました」の解決方法
docker パッケージング Python 環境の手順は次のとおりです。 1 pip listの下に...
1. MySQLデータベースのユーザーテーブルのレコードのHostフィールド値を%に変更します。奇妙...
CentOS の紹介CentOS は、Red Hat Linux が提供する無料で利用できるソースコ...
この記事は主にMySQLデータ移行方法とツールの分析を紹介します。サンプルコードを通じて詳細に紹介さ...
1. 日付のサイズを比較するには、XML に渡される日付形式は 'yyyy-MM-dd...
デザイナーは心理学を理解する必要があるデザイナーが知るべき心理学という本は非常に興味深いです。まず、...
方法1: cmdコマンドを使用するまず、DOS ウィンドウを開き、スタート、実行、cmd と入力しま...
1. テーブル リセットの 2 つのプロパティ: ①border-collapse: collaps...
昨晩、面接の質問を見ていたら、CSS スタイルの優先順位について特に明確に説明していない人が何人かい...
「Enter != Submit」問題を実装するには、通常、「ボタンの種類」と「入力ボックスの数」か...
システム提供のMySQLをアンインストールする1. MySQLがシステムにインストールされているかど...
目次1. 概要2. Nginxインストールパッケージをダウンロードする3. 依存パッケージをインスト...
目次1. テレポートについて知る2. テレポートの基本的な使い方3. 最初のステップの最適化4. 第...
序文開発プロセスでは、すべてのデータではなく特定の期間内のデータをクエリするなど、クエリのフィルタリ...
目次1. js整数の演算2. ネイティブアラートを書き換えてポップアップボックスの数を記録する3. ...