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 の仕組みと実装の詳細な説明

推薦する

20個のJavaScriptワンラインコードを共有する

目次1. ブラウザのクッキーの値を取得する2. RGBを16進数に変換する3. クリップボードにコピ...

MySQLの重複排除操作を極限まで最適化する方法

目次1. インデックスと変数の賢い使用1. インデックスなしの比較テスト2. created_tim...

nginx でネストされた if メソッドを実装する方法

Nginx はネストされた if ステートメントをサポートしておらず、if ステートメントでの論理判...

React 非親子コンポーネントパラメータ渡しのサンプルコード

React は、ユーザー インターフェイスを構築するための JavaScript ライブラリです。 ...

CSSはスクロールを許可しながらスクロールバーを非表示にするためにオーバーフローを設定します

CSS は、スクロールを許可しながらスクロール バーを非表示にするために Overflow を設定し...

mysql5.7.24 バージョンのインストール手順と解凍時に発生した問題の概要

1. ダウンロード参考: 2. D:\MySQL\mysql-5.7.24 などの固定の場所に解凍し...

CSSで背景ぼかしを設定する方法

ページを作成するときに、ページの見栄えを良くするために、背景画像を設定する必要があることがよくありま...

MySQL 継続的集計の原理と使用法の分析

この記事では、例を使用して、MySQL の継続的な集計の原理と使用方法を説明します。ご参考までに、詳...

HTMLページをクリックしてダウンロードファイルを実装する2つの方法

1. <a>タグを使用して完了します <a href="/user/te...

Vueの計算プロパティの詳細な説明

1. 計算属性とは何ですか? 簡単に言えば、計算された結果が属性に保存されるもので、キャッシュとして...

ウェブカラーのコントラストと調和のテクニックの共有

色のコントラストと調和対照的な状況では、色の相互作用は単一の色によって与えられる感覚とは異なります。...

Tomcat ソースコード起動コンソールの中国語文字化けのデバッグプロセス記録

問題を見つける今日はTomcatのソースコードを勉強するつもりなので、公式サイトからTomcatのソ...

Vue3 がデータ監視を実装するためにプロキシを使用する理由の分析

Vue データの双方向バインディング原則ですが、この方法には欠点があり、配列とオブジェクトの部分的な...

MySQL 5.7 と Mac 上の MySql の詳細なインストール図をダウンロードする

1.ブラウザに次のアドレスを入力します参考: 2. 次のインターフェースに入ります。下の場所をクリッ...

MySQL データ型の詳細

目次1. 数値型1.1 数値型の分類1.1.1 浮動小数点数1.1.2 ビットタイプ1.1.3 時間...