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

推薦する

Vueはプログレスバーの変更効果を実現します

この記事ではVueを使ってプログレスバーの変更を簡単に実装してみましたので参考にしてください。具体的...

Mysql5.6.36 スクリプトのコンパイル、インストール、初期化のチュートリアル

概要この記事は、centos7.3 上で mysql5.3.6 を自動的にコンパイルしてインストール...

HTML でマウスが停止したときに行全体の色 (tr) を変更する方法

純粋な CSS を使用して、マウスが行の上を通過するときに行の背景色を変更し、その行にフォーカスがあ...

MySQL公式パフォーマンステストツールmysqlslapの使い方の紹介

目次導入説明書実際の経験まとめ導入MySQL は最も人気のあるオープンソース データベースとして、さ...

Adobe Brackets の簡単な使い方のグラフィックチュートリアル

Adobe Brackets は、HTML、CSS、JavaScript 用のオープンソースでシンプ...

MySQL データベースの詳細な説明 (Ubuntu 14.0.4 LTS 64 ビットベース)

1. MySQLデータベースの構成と関連概念まず、MySQL はリレーショナル データベースである...

MySQL 5.7.17 winx64 のインストールと設定のチュートリアル

今日、MySQL データベースをコンピューターに再度インストールしました。システムを再インストールす...

MySQLの実行プロセスとシーケンスについての簡単な説明

目次1:mysql実行プロセス1.1: コネクタ1.2: キャッシュ1.3: アナライザー1.4: ...

Vueプラグインの書き方を説明する記事

目次プラグインとはプラグインの作成プラグインの使用要約するプラグインとはVue フレームワークでは、...

MySQL マスタースレーブ同期の原理と応用

目次1. マスタースレーブ同期原理マスタースレーブ同期アーキテクチャ図(非同期同期)マスタースレーブ...

ポップアップはすべて不正なものではありません。ウェブサイトのポップアップをデザインするためのヒント

ポップアップニュースは国内のインターネットサービスでは一般的であり、リアルタイムプッシュ方式はウェブ...

HTML Web ページ リスト タグ学習チュートリアル

HTML Web ページ リスト タグの学習チュートリアル。 HTML ページでは、リストはアウトラ...

MySQL 5.7.18 インストールチュートリアルと問題の概要

MySQL 5.7.18 のインストールと問題の概要。今日、新しい MySQL サーバーを導入しまし...

Linuxファイル削除後にスペースが解放されない問題の詳しい説明

序文システム領域の使用量が大きすぎて消去する必要がある場合、または特定のファイルを消去する必要がある...

Mysql関数呼び出しの最適化の詳細な説明

目次関数呼び出しの最適化関数呼び出しの最適化MySQL 関数は、内部的に決定論的または非決定論的とし...