MySQLテーブル内の重複データをクエリする方法

MySQLテーブル内の重複データをクエリする方法
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テーブル内の重複レコードを見つける
MySQLデータベースにはどんどんデータが増えてきており、当然重複データは排除できません。データをメンテナンスしているときに、冗長なデータを削除して、価値のあるデータだけを残すことをふと思いつきました。

次の SQL ステートメントは、テーブル内のすべての重複レコードを検索できます。
user_table から user_name、count(*) を count として選択します。count>1 を持つ user_name でグループ化します。

パラメータの説明:

user_name は検索対象となる繰り返しフィールドです。

Count は、数値が 1 より大きいかどうか、また、数値が繰り返されているかどうかを判断するために使用されます。

user_table は検索するテーブルの名前です。

group byはグループ化に使用されます

having はフィルタリングに使用されます。

パラメータを、自分のデータ テーブルの対応するフィールド パラメータに置き換えます。まず、Phpmyadmin または Navicat で実行して、どのデータが重複しているかを確認し、データベースでそれらを削除します。また、ニュースを読み取るバックグラウンド ページに SQL ステートメントを直接配置して、それを読み取って、クエリの重複データのリストに完成させることもできます。重複がある場合は、直接削除できます。

効果は以下のとおりです。

デメリット: この方法のデメリットは、データベース内のデータ量が多い場合、効率が非常に低くなることです。私はNavicatを使用してテストしました。データ量は多くなく、効率は非常に高かったです。もちろん、Webサイトにはクエリデータを繰り返す他のSQL文もあります。これを参考にして慎重に研究し、Webサイトに適したクエリ文を見つけることができます。

以下もご興味があるかもしれません:
  • MySQL で重複レコードをクエリして削除する方法の完全なガイド
  • MySQL で複数のデータをランダムにクエリする方法
  • 行から行へのMySQLクエリステートメント
  • MySQLクエリ連続記録方式

<<:  WeChatアプレットの世界的な状況の詳細な説明

>>:  Nginx における accept lock の仕組みと実装の詳細な説明

推薦する

Ubuntu 18.04 に opencv 3.2.0 をインストールするためのソリューション

opencv.zip をダウンロード依存関係を事前にインストールします。まずダウンロードソースを更新...

Linux で MySQL パスワードを忘れた場合の解決策

問題は次のとおりです。mysql -uroot -p コマンドを入力しましたが、パスワードを忘れてし...

HTML の 5 種類のスペースの意味

HTML には、幅の異なる 5 つのスペース エンティティが用意されています。非改行スペース ( )...

mysql 5.7.17 winx64.zip インストールと設定方法のグラフィックチュートリアル

はじめに: Windows 10 を再インストールし、同時にファイルを整理しました。しかし、MySQ...

...

Nginx をインストールして複数のドメイン名を設定する方法

Nginx のインストールCentOS 6.x yum にはデフォルトで nginx ソフトウェア ...

Vue で $attrs と $listeners を使用するチュートリアル

目次導入例要約する導入$属性すべての親コンポーネントのプロパティを継承します (props を通じて...

Vue はカスタム「モーダル ポップアップ ウィンドウ」コンポーネントのサンプル コードを実装します

目次序文レンダリングサンプルコード要約する序文ダイアログ ボックスは非常に一般的なコンポーネントであ...

JavaScriptイベント実行メカニズムの深い理解

目次序文ブラウザJS非同期実行の原理ブラウザのイベントループ実行スタックとタスクキューマクロタスクと...

背景のグラデーションと自動フルスクリーンを実現するCSSコード

背景グラデーションと自動フルスクリーンに関する CSS の問題編集長は CSS の開発中に致命的な問...

CSS: 訪問した疑似クラスセレクタの秘密の記憶

昨日、a:visited を使用して「Guess You Like」の右側にある訪問済みテキストの色...

コンパイル、インストールから設定ファイルの説明まで、中国語でnginxの詳細な説明

この記事では、コンパイルとインストールから設定ファイルの説明まで、Nginx について詳しく紹介しま...

Vue の高度な構築プロパティの詳細な説明

目次1. ディレクティブカスタムディレクティブ2. ミックスイン3. 継承を拡張する4. 提供して注...

MySQLは実際に分散ロックを実装できる

序文前回の記事では、eコマース シナリオでのフラッシュ セールの例を通じて、モノリシック アーキテク...

MySQL でテーブルを作成するときの NULL と NOT NULL の使用方法の詳細な説明

MySQL の仕様によっては、テーブル作成仕様にすべてのフィールドが空であってはならないという要件を...