2017-09-17 12 views
0

私のmysqlテーブルwordsに2つのカラムがあり、これらのカラムの名前はwordidで、他のカラムはlemmaです。mysqlテーブルから重複したテキストレコードを削除する方法

lemmaの重複値をテーブルから削除する必要があります。 MySQLのコマンドでどうすればいいのか教えてください。ここに私のテーブルのサンプルです。

wordid || lemma 

+--------+--------------------+ 

148206 || wilful disobedience 

149162 || wilful disobedience 

149857 || wilful disobedience 

答えて

1

これを行う最も簡単な方法は、lemma列にUNIQUEインデックスを追加することです。 ALTERステートメントにIGNOREを含めると、すべての重複が削除されます。重複を伴う次の挿入はエラーを投げることに注意してください。

ALTER IGNORE TABLE words 
ADD UNIQUE INDEX idx_lemma (lemma); 
+0

構文エラーです。 – Nisa

+0

@Nisa、このフィドルを見てください:http://sqlfiddle.com/#!9/f4cef0/1。すべての作業、多分エラーを再現するためにステップごとに完全なクエリを提供する?あるいは、より良いフィドル –

0

あなたは、内側からの削除を使用することができますが副選択の形で参加wordidが

delete from my_table a 
    inner join (
    select wordid 
    from my_table 
    group by lemma 
    having count(*) >1 
) t on a.wordid = t.word.id 
    where wordid not in ( select wordid_to_delete 
    from (
      select min(wordid) as wordid_to_delete 
      from my_table 
      group by lemma 
      having count(*)>1 
    ) t2 

) 
0

最初のステップは、重複する主キー値を持つ行を識別することで削除しないことを得る:

 SELECT col1, col2, count(*) 
     FROM t1 
     GROUP BY col1, col2 
     HAVING count(*) > 1 

これは、テーブル内の重複PK値の各セットに対して1つの行を返します。この結果の最後の列は、特定のPK値の重複数です。

重複するPK値の数が少ない場合は、手動で個別に削除するのが最善の手順です。例えば:

set rowcount 1 
    delete from t1 
     where col1=1 and col2=1 

行カウント値が所定のキー値の重複のN-1個であるべきです。

テーブルに重複するPK値のセットが多数ある場合は、それらを個別に削除するには時間がかかる可能性があります。この場合、次の手順を使用できます。

- まず、上記のGROUP BYクエリを実行して、重複PK値のセット数と各セットの重複カウントを確認します。

- 重複するキー値を保持テーブルに選択します。例:

 SELECT col1, col2, col3=count(*) 
     INTO holdkey 
    FROM t1 
    GROUP BY col1, col2 
    HAVING count(*) > 1 

- 重複する行を保持テーブルに選択し、プロセス内の重複を排除します。たとえば:

 SELECT DISTINCT t1.* 
    INTO holddups 
    FROM t1, holdkey 
    WHERE t1.col1 = holdkey.col1 
    AND t1.col2 = holdkey.col2 

この時点で、holddupsテーブルはt1が、重複のPKを持っている場合しかし、これは事実ではありません、独特のPKを持っている必要があります。たとえば、

元のテーブルから重複する行を削除します。たとえば:

 DELETE t1 
    FROM t1, holdkey 
    WHERE t1.col1 = holdkey.col1 
    AND t1.col2 = holdkey.col2 

は、元のテーブル内の一意の行を入れてください。例:

 INSERT t1 SELECT * FROM holddups 
あなたは、次のクエリを使用して、一度にこれを行うことができます
1

delete * from table_name where wordid not in (select wordid from table_name group by lemma) 

内側のクエリは、各補題の最初のwordidを選択し、繰り返しを無視します。 外部クエリは、内部クエリの結果から単語IDを持たないすべての行を削除します。繰り返し補題を持つ他のすべての行が削除されます。

関連する問題