hk_test(ユーザー名、パスワード) に値を挿入 ('qmf1', 'qmf1'),('qmf2', 'qmf11') ユーザー名='qmf1'、パスワード='qmf1' の hk_test から削除します。 MySQL のテーブル内の重複データ レコードをクエリします。 まず、繰り返される生データを表示します。 シナリオ 1: ユーザー名フィールドに繰り返し読み取りが行われるデータを一覧表示する count>1を持つユーザー名でhk_testグループからユーザー名、count(*)をcountとして選択します。 SELECT username,count(username) as count FROM hk_test GROUP BY username HAVING count(username) >1 ORDER BY count DESC; このメソッドは、フィールドの特定の繰り返し回数のみをカウントします。 シナリオ 2: ユーザー名フィールドに重複レコードの特定の情報を一覧表示します。 select * from hk_test where username in (count(username) > 1 を持つユーザー名で hk_test グループからユーザー名を選択) SELECT username,passwd FROM hk_test WHERE username in ( SELECT username FROM hk_test GROUP BY username HAVING count(username)>1) しかし、このステートメントは MySQL では非効率すぎます。MySQL はサブクエリ用の一時テーブルを生成しないようです。データ量が多いと時間がかかります 解決: そこでまずcreate table `tmptable` as (を使用して一時テーブルを作成します。 `名前`を選択 `テーブル`から GROUP BY `name` HAVING count(`name`) > 1 ); 次に、マルチテーブル結合クエリSELECT a.`id`, a.`name`を使用します。 `table` a、`tmptable` t から ここで、a.`name` = t.`name`; 今回は結果が非常に早く出ました。 重複を削除するには、distinct を使用します。SELECT distinct a.`id`, a.`name` `table` a、`tmptable` t から ここで、a.`name` = t.`name`; シナリオ 3: 重複フィールドを持つレコードを表示する: たとえば、ユーザー名とパスワードの両方のフィールドに重複レコードがあるとします。 hk_testから*を選択 (a.username,a.passwd) が (hk_test から username,passwd を選択し、count(*) > 1 を持つ username,passwd でグループ化) 内にある場合 シナリオ 4: テーブル内で複数のフィールドが同時に繰り返されるレコードをクエリします。 hk_test からユーザー名、パスワード、カウント (*) を選択します。ユーザー名、パスワードで count(*) > 1 を持つグループです。 MySQL クエリ テーブルで重複レコードをクエリして削除する方法 (パート 1) 1. テーブル内の重複レコードを検索します。重複レコードは、単一のフィールド (peopleId) に基づいて決定されます。* を選択します。 人々から peopleId が (count(peopleId)>1 を持つ peopleId で people グループから peopleId を選択) 2. テーブル内の重複レコードを削除します。重複レコードは単一のフィールド (peopleId) に基づいて決定されます。残るレコードは 1 つだけです。delete from people peopleIdが(peopleIdを選択) count(peopleId)>1 を持つ peopleId による人物グループから) そしてmin(id)は in (count(peopleId)>1 を持つ peopleId で people グループから ID を選択) 3. テーブル内の重複レコードを検索する(複数のフィールド) 履歴書Aから*を選択 (a.peopleId,a.seq) の (count(*)>1 を持つ peopleId、seq で履歴書グループから peopleId、seq を選択) 4. テーブル内の重複レコード(複数のフィールド)を削除し、最小のROWIDを持つレコードのみを残します。 どこ (a.peopleId,a.seq) で (履歴書から peopleId,seq を選択、peopleId,seq でグループ化) count(*) > 1)を持つ ROWIDが(vitaeグループからmin(ROWID)を選択)に含まれません peopleId、seq が count(*)>1 の場合) 5. テーブル内の重複レコード(複数のフィールド)を検索し、最小のROWIDを持つレコードを除外する select * from vitae a どこ (a.peopleId,a.seq) で (履歴書から peopleId,seq を選択、peopleId,seq でグループ化) count(*) > 1)を持つ ROWIDが(vitaeグループからmin(ROWID)を選択)に含まれません peopleId、seq が count(*)>1 の場合) (二) たとえば、テーブル A に「名前」フィールドがあり、異なるレコード間の「名前」値が同じである可能性があります。ここで、テーブル内のレコード間で重複した「名前」値を持つ項目を見つける必要があります。 名前とカウント(*)を、カウント(*) > 1 を持つ名前でグループから選択します。 性別が同じ場合、結果は次のようになります。 名前、性別、カウント(*)が1より大きいグループから名前、性別、カウント(*)を選択します (三つ) 方法 1: @max 整数、@id 整数を宣言する cur_rows カーソルをローカルに宣言します。選択プライマリフィールド、count(*)、テーブル名、プライマリフィールドによるグループ化、count(*) >; 1 cur_rows を開く cur_rows を @id,@max にフェッチします @@fetch_status=0 の場合 始める @max = @max -1 を選択 行数を@maxに設定 プライマリフィールドが @id であるテーブル名から削除します cur_rows を @id,@max にフェッチします 終わり cur_rowsを閉じる 行数を0に設定 tab1 から * を選択し、CompanyName を (tab1 から companyname を選択し、GROUP BY CompanyName を選択し、COUNT(*)>1 を指定します); -- 129.433ミリ秒 tab1 から * を選択し、 INNER 結合します ( tab1 から companyname を選択し、 GROUP BY CompanyName HAVING COUNT(*)>1) を tab2 として USING(CompanyName) とします。 -- 0.482ミリ秒 方法 2 では、2 つの意味で重複レコードがあります。1 つは完全に重複したレコード、つまりすべてのフィールドが繰り返されているレコードです。もう 1 つは、一部のキー フィールドが繰り返されているレコードです。たとえば、名前フィールドが繰り返されますが、他のフィールドは繰り返されない可能性があり、繰り返されているすべてのフィールドを無視できます。 1. 最初のタイプの重複は解決が簡単です。select distinctive * from tableNameを使用します。 重複レコードのない結果セットを取得できます。 テーブルから重複レコードを削除する必要がある場合(重複レコードを 1 つだけ保持する場合)、次のように削除できます: select distinct * into #Tmp from tableName テーブルテーブル名を削除します #Tmp から tableName に * を選択 テーブル #Tmp を削除します この重複はテーブルの設計が不適切であるために発生し、一意のインデックス列を追加することで解決できます。 2. このタイプの重複問題では、通常、重複レコードの最初のレコードを保持する必要があります。操作方法は次のとおりです。重複フィールドが名前と住所であり、これら 2 つのフィールドに対して一意の結果セットを取得する必要があると仮定します。select identity(int,1,1) as autoID, * into #Tmp from tableName 名前、自動ID で #Tmp グループから min(自動ID) を自動 ID として #Tmp2 に選択します。 #Tmp から * を選択し、autoID が in であることを確認します (#tmp2 から autoID を選択) 最後の選択では、一意の名前とアドレスを含む結果セットが返されます (ただし、追加の autoID フィールドが含まれますが、これは書き込み時に選択句で省略できます)。 (IV) クエリを繰り返して、select * from tablename where id in ( テーブル名からIDを選択し、IDでグループ化し、count(id) > 1とする) よく使用されるステートメント 1. テーブル内の冗長な重複レコードを検索します。重複レコードは、単一のフィールド (mail_id) に基づいて決定されます。コードは次のとおりです。コードをコピー SELECT * FROM table WHERE mail_id IN (SELECT mail_id FROM table GROUP BY mail_id HAVING COUNT(mail_id) > 1); 2. テーブル内の冗長な重複レコードを削除します。重複レコードは、単一のフィールド (mail_id) に基づいて決定されます。最小の rowid を持つレコードのみが保持されます。コードは次のとおりです: DELETE FROM table WHERE mail_id IN (SELECT mail_id FROM table GROUP BY mail_id HAVING COUNT(mail_id) > 1) AND rowid NOT IN (SELECT MIN(rowid) FROM table GROUP BY mail_id HAVING COUNT(mail_id )>1); 3. テーブル内の重複レコードを検索する(複数のフィールド) コードは次のとおりです。コードをコピー SELECT * FROM table WHERE (mail_id,phone) IN (SELECT mail_id,phone FROM table GROUP BY mail_id,phone HAVING COUNT(*) > 1); 4. テーブル内の冗長な重複レコード (複数のフィールド) を削除し、最小の rowid を持つレコードのみを保持します。コードは次のとおりです: DELETE FROM table WHERE (mail_id,phone) IN (SELECT mail_id,phone FROM table GROUP BY mail_id,phone HAVING COU(www.jb51.net)NT(*) > 1) AND rowid NOT IN (SELECT MIN(rowid) FROM table GROUP BY mail_id,phone HAVING COUNT(*)>1); 5. 最小の rowid を持つレコードを除外して、テーブル内の冗長な重複レコード (複数のフィールド) を検索します。コードは次のとおりです: SELECT * FROM table WHERE (a.mail_id,a.phone) IN (SELECT mail_id,phone FROM table GROUP BY mail_id,phone HAVING COUNT(*) > 1) AND rowid NOT IN (SELECT MIN(rowid) FROM table GROUP BY mail_id,phone HAVING COUNT(*)>1); ストアドプロシージャは@max integer、@id integerを宣言します cur_rows カーソルをローカルに宣言します。選択プライマリフィールド、count(*)、テーブル名、プライマリフィールドによるグループ化、count(*) >; 1 cur_rows を開く cur_rows を @id,@max にフェッチします @@fetch_status=0 の場合 始める @max = @max -1 を選択 行数を@maxに設定 プライマリフィールドが @id であるテーブル名から削除します cur_rows を @id,@max にフェッチします 終わり cur_rowsを閉じる 行数を0に設定 (I) 単一フィールド 1. テーブル内の冗長な重複レコードを検索し、(question_title) フィールドに従って判断します。コードは次のとおりです。コードをコピー select * from questions where question_title in (select question_title from people group by question_title having count(question_title) > 1) 2. テーブル内の重複レコードを削除します。(question_title)フィールドによると、残っているレコードは1つだけです。コードは次のとおりです。deleteコードをquestionsからコピーします。 peopleId が (count(question_title) > 1 を持つ peopleId で people グループから peopleId を選択) の場合 そして min(id) は (count(question_title)>1 を持つ question_title による質問グループから question_id を選択) に含まれません (II) 複数のフィールド テーブル内の冗長な重複レコード (複数のフィールド) を削除し、最小の rowid を持つレコードのみを残します。コードは次のとおりです。コードをコピー DELETE FROM questions WHERE (questions_title,questions_scope) IN (SELECT questions_title,questions_scope FROM questions GROUP BY questions_title,questions_scope HAVING COUNT(*) > 1) AND question_id NOT IN (SELECT MIN(question_id) FROM questions GROUP BY questions_scope,questions_title HAVING COUNT(*)>1) 上記のステートメントを使用してデータを削除することはできません。削除する前に一時テーブルを作成する必要があります。これについて説明していただけますか? コードは次のとおりです。コードをコピーします。CREATE TABLE tmp AS SELECT question_id FROM questions WHERE (questions_title,questions_scope) IN (SELECT questions_title,questions_scope FROM questions GROUP BY questions_title,questions_scope HAVING COUNT(*) > 1) AND question_id NOT IN (SELECT MIN(question_id) FROM questions GROUP BY questions_scope,questions_title HAVING COUNT(*)>1); DELETE FROM questions WHERE question_id IN (SELECT question_id FROM tmp); テーブル tmp を削除します。 MySQLテーブル内の重複レコードを見つける 次の SQL ステートメントは、テーブル内のすべての重複レコードを検索できます。 パラメータの説明: user_name は検索対象となる繰り返しフィールドです。 Count は、数値が 1 より大きいかどうか、また、数値が繰り返されているかどうかを判断するために使用されます。 user_table は検索するテーブルの名前です。 group byはグループ化に使用されます having はフィルタリングに使用されます。 パラメータを、自分のデータ テーブルの対応するフィールド パラメータに置き換えます。まず、Phpmyadmin または Navicat で実行して、どのデータが重複しているかを確認し、データベースでそれらを削除します。また、ニュースを読み取るバックグラウンド ページに SQL ステートメントを直接配置して、それを読み取って、クエリの重複データのリストに完成させることもできます。重複がある場合は、直接削除できます。 効果は以下のとおりです。 デメリット: この方法のデメリットは、データベース内のデータ量が多い場合、効率が非常に低くなることです。私はNavicatを使用してテストしました。データ量は多くなく、効率は非常に高かったです。もちろん、Webサイトにはクエリデータを繰り返す他のSQL文もあります。これを参考にして慎重に研究し、Webサイトに適したクエリ文を見つけることができます。 以下もご興味があるかもしれません:
|
>>: Nginx における accept lock の仕組みと実装の詳細な説明
目次1. ブラウザのクッキーの値を取得する2. RGBを16進数に変換する3. クリップボードにコピ...
目次1. インデックスと変数の賢い使用1. インデックスなしの比較テスト2. created_tim...
Nginx はネストされた if ステートメントをサポートしておらず、if ステートメントでの論理判...
React は、ユーザー インターフェイスを構築するための JavaScript ライブラリです。 ...
CSS は、スクロールを許可しながらスクロール バーを非表示にするために Overflow を設定し...
1. ダウンロード参考: 2. D:\MySQL\mysql-5.7.24 などの固定の場所に解凍し...
ページを作成するときに、ページの見栄えを良くするために、背景画像を設定する必要があることがよくありま...
この記事では、例を使用して、MySQL の継続的な集計の原理と使用方法を説明します。ご参考までに、詳...
1. <a>タグを使用して完了します <a href="/user/te...
1. 計算属性とは何ですか? 簡単に言えば、計算された結果が属性に保存されるもので、キャッシュとして...
色のコントラストと調和対照的な状況では、色の相互作用は単一の色によって与えられる感覚とは異なります。...
問題を見つける今日はTomcatのソースコードを勉強するつもりなので、公式サイトからTomcatのソ...
Vue データの双方向バインディング原則ですが、この方法には欠点があり、配列とオブジェクトの部分的な...
1.ブラウザに次のアドレスを入力します参考: 2. 次のインターフェースに入ります。下の場所をクリッ...
目次1. 数値型1.1 数値型の分類1.1.1 浮動小数点数1.1.2 ビットタイプ1.1.3 時間...