1. 重複行を見つける方法最初のステップは、重複行としてカウントされるものを定義することです。ほとんどの場合、これは単純です。1 つの列に同じ値が存在します。この記事ではこの定義を使用します。おそらく、「重複」の定義はこれよりも複雑で、SQL にいくつかの変更を加える必要があるでしょう。 この記事で使用されているデータ サンプルは次のとおりです。 テーブル test(id int not null primary key, day date not null) を作成します。 テストに挿入(id, day) values(1, '2006-10-08'); テストに挿入(id, day) values(2, '2006-10-08'); テストに挿入(id, day) values(3, '2006-10-09'); テストから*を選択します。 +----+-------------+ | id | 日 | +----+-------------+ | 1 | 2006-10-08 | | 2 | 2006-10-08 | | 3 | 2006-10-09 | +----+-------------+ 最初の 2 行の テストから日、count(*) を GROUP BY day で選択します。 +------------+-----------+ | 日 | カウント(*) | +------------+-----------+ | 2006-10-08 | 2 | | 2006-10-09 | 1 | +------------+-----------+
テストグループから day、count(*) を選択します。 HAVING count(*) > 1; +------------+-----------+ | 日 | カウント(*) | +------------+-----------+ | 2006-10-08 | 2 | +------------+-----------+ これは基本的な手法です。同じ値を持つフィールドでグループ化し、サイズが 1 より大きいグループを表示します。 WHERE 句を使用できないのはなぜですか? WHERE 句はグループ化の前に行をフィルタリングし、HAVING 句はグループ化の後に行をフィルタリングするためです。 2. 重複行を削除する方法関連する質問は、重複行を削除する方法です。一般的なタスクは、重複する行を 1 行だけ保持し、他の行を削除することです。その後、適切なインデックスを作成して、重複する行が将来データベースに書き込まれるのを防ぐことができます。 繰り返しになりますが、最初にやるべきことは、重複行とは何かを把握することです。どのラインを維持したいですか?最初の行ですか、それとも特定のフィールドの最大値を持つ行ですか?この記事では、最初の行 (ID フィールドの値が最小の行) を保持し、他の行を削除することを前提としています。 おそらく、これを行う最も簡単な方法は、一時テーブルを使用することです。特に 私たちのタスクは、グループ内の 一時テーブル to_delete を作成します (day date が null ではない、min_id int が null ではない); to_delete(day, min_id) に挿入します count(*) > 1 を持つ日を基準に、テストグループから day, MIN(id) を選択します。 to_delete から * を選択します。 +------------+---------+ | 日 | min_id | +------------+---------+ | 2006-10-08 | 1 | +------------+---------+ このデータを入手したら、「ダーティ」行の削除を開始できます。いくつかのアプローチがあり、それぞれに長所と短所がありますが、ここではクエリ句をサポートするリレーショナル データベースで使用される標準的なアプローチを説明する以外、詳細な比較は行いません。 テストから削除 存在する場所( to_delete から * を選択 ここで、to_delete.day = test.day かつ to_delete.min_id <> test.id ) 3. 複数の列で重複を見つける方法最近、誰かがこの質問をしました:テーブルの 1 つにフィールド b と c の 2 つがあり、それぞれ他の 2 つのテーブルのフィールド b と c に関連付けられています。 b フィールドまたは c フィールドのいずれかに重複した値を持つ行を見つけたいです。 最初は理解しづらかったのですが、会話をしていくうちに、b と c にそれぞれ テーブルa_b_cを作成します( NULLでないint主キーauto_increment、 b 整数、 c 整数 ); a_b_c(b,c)に値(1, 1)を挿入します。 a_b_c(b,c)に値(1, 2)を挿入します。 a_b_c(b,c)に値(1, 3)を挿入します。 a_b_c(b,c) に値 (2, 1) を挿入します。 a_b_c(b,c) に値 (2, 2) を挿入します。 a_b_c(b,c)に値(2, 3)を挿入します。 a_b_c(b,c)に値(3, 1)を挿入します。 a_b_c(b,c)に値(3, 2)を挿入します。 a_b_c(b,c)に値(3, 3)を挿入します。 ここで、テーブル内に重複する行がいくつかあるが、2 つの行に同じタプル {b, c} がないことが簡単にわかります。だからこそ、問題は難しくなるのです。 4. クエリステートメントが正しくない両方の列をグループ化すると、グループ化の方法とサイズの計算方法に応じて異なる結果が得られます。まさにここが質問者が行き詰まっているところです。場合によっては、クエリによって重複行がいくつか見つかり、他の行が見つからないことがあります。彼が使ったクエリはこれです a_b_c から b、c、count(*) を選択 b、c でグループ化 count(distinct b > 1) を持つ または count(distinct c > 1);
a_b_c から b、c、count(*) を選択 b、c でグループ化 数える(1) またはcount(1); なぜ? (b > 1) はブール値であるため、これはまったく必要ないからです。あなたが望むのは a_b_c から b、c、count(*) を選択 b、c でグループ化 count(distinct b) > 1 である または count(distinct c) > 1; 空の結果を返します。明らかに、 a_b_c から b を選択し、count(*) をグループ化します。count(distinct c) > 1 を持ちます。 +------+----------+ | b | カウント(*) | +------+----------+ | 1 | 3 | | 2 | 3 | | 3 | 3 | +------+----------+ いずれも重複行をすべて見つけることはできません。そして最もイライラするのは、これが正しい書き方だと誤って考えれば、状況によってはこの記述が有効になるものの、他の状況では間違った結果になる可能性があるということです。 実際、 b フィールドを並べ替え (グループ化) すると、c の同じ値が異なるグループに分割されるため、 5. いくつかの正しい方法おそらく最も簡単な方法は、各フィールドの重複行を個別に見つけ、次のように UNION を使用してそれらを結合することです。 b を値として選択し、count(*) を cnt として選択し、'b' を what_col として選択します。 a_b_c から count(*) > 1 を持つ b によるグループ化 連合 値として c を選択し、cnt として count(*) を選択し、what_col として 'c' を選択します。 a_b_c から count(*) > 1 を持つ c でグループ化します。 +-------+-----+-----------+ | 値 | 個数 | 列数 | +-------+-----+-----------+ | 1 | 3 | バ | | 2 | 3 | バ | | 3 | 3 | b | | 1 | 3 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | | 2 | 3 | 3 | 4 | | 3 | 3 | c | +-------+-----+-----------+
a_b_c から a、b、c を選択 b が (a_b_c から b を選択し、count(*) > 1 を持つ b でグループ化) にある場合 または c in (count(*) > 1 を持つ c によって a_b_c グループから c を選択)。 +----+------+------+ | a | b | c | +----+------+------+ | 7 | 1 | 1 | | 8 | 1 | 2 | | 9 | 1 | 3 | | 10 | 2 | 1 | | 11 | 2 | 2 | | 12 | 2 | 3 | | 13 | 3 | 1 | | 14 | 3 | 2 | | 15 | 3 | 3 | +----+------+------+ この方法は a、a_b_c.b、a_b_c.c を選択 a_b_c から 左外部結合( a_b_c から b を選択し、count(*) > 1 を持つ b でグループ化します。 ) は a_b_c.b 上の b = bb である 左外部結合( a_b_c から c を選択し、count(*) > 1 を持つ c でグループ化します。 ) は a_b_c.c = cc の c として bb が null ではない、または cc が null ではない 上記の方法は有効ですが、他にも方法はあると思います。 これで、MySQL で重複行を見つけて削除する方法についての記事は終わりです。MySQL で重複行を見つけて削除する方法の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: JavaScript における var と let の違い
<div id="ルート"> <h2>頑張れ、{{na...
1. 前述の通り数年前、Linux ドライバーのコードを読んでいたときにこのマクロを見ました。長い間...
通常、私たちが構築する Docker イメージはサイズが大きく、多くのディスク領域を占有します。コン...
この記事は主にMySQLの日付処理関数のサンプル分析を紹介します。この記事ではサンプルコードを詳細に...
目次1. コード分析2. ソースコードソースコード1. コード分析1.1 HTMLコード分析 <...
今日、インターフェースの同時実行の問題を検証したところ、これまでredisで解決していた同時実行のプ...
一つの要求一般的に、企業には複数のプロジェクトがあります。SVN サーバーを設定した後は、プロジェク...
序文プロジェクト要件: Dockeridea に Docker プラグインをインストールし、Dock...
この記事では、シームレスなカルーセル効果を実現するためのVueの具体的なコードを参考までに紹介します...
目次1. 最も単純なサーバー側の例2. バインドシステムコール2.1、inet_bind 2.2、i...
1. 公式5.0.3イメージを取得する [root@localhost ~]# docker pul...
公式、電子商取引、ソーシャル ネットワーキング、個人のいずれの Web サイトでも、訪問者に貴重な時...
ほとんどの場合、PC でファイルをアップロードするにはプラグインが使用され、フラッシュが導入されても...
問題の説明Centos7 をローカルにインストールして 3 つの仮想マシンを作成し、Swarm クラ...
参考までに、JavaScriptを使用してドロップダウンメニューを実装します。具体的な内容は次のとお...