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 の違い
Harborのインストールは非常に簡単ですが、Dockerログインで行き詰まってしまいました。このブ...
序文IE の将来のすべてのバージョンで Web ページの外観が一貫していることを保証するために、IE...
以下のように表示されます。 1. ssh -v -p [ポート番号] [ユーザー名]@[IPアドレス...
JS のクラスの定義や継承は本当に多様なので、別のノートブックを開いて記録しておきます。意味オブジェ...
HTML でアンカーの位置を設定する方法はいくつかあるので、ここで紹介します。 1. ID ポジショ...
1. クエリを最適化するには、テーブル全体のスキャンを避けてください。まず、where と orde...
WeChatアプレットはスクロールビューを使用して左右のリンクを実現します。参考までに、具体的な内容...
ユーザーが登録すると、ラベルをクリックして確認コードを変更します。クリックするとラベルに影の部分がで...
序文前回の記事では Hadoop をインストールしましたが、今回は Hbase をインストールします...
1. ゴミかクラシックか? Web テクノロジーは急速に更新されており、Web サイトのインターフェ...
1. 親コンポーネントはpropsを通じて子コンポーネントにデータを渡すことができる2. 子コンポー...
以前のブログでは、Tomcatのサーバーの各コンポーネントの使用について学びました。 Tomcatは...
データが変更されても、DOM ビューはすぐには更新されません。変更直後にノードまたはその値を取得しよ...
目次序文1. イベントとクリップボードを貼り付ける2. クリップボード内のコンテンツ形式3. HTM...
のようにLIKE ではデータ全体が一致する必要がありますが、REGEXP では部分的な一致のみが必要...