0

データベースにいくつかの重複を導入するクエリを入力しました。表は単純明快です。

id(int)列とvarchar(255)であるフレーズ列があります。重複を見つけるために、私のクエリは次のようになります。

SELECT phrase from foo GROUP BY phrase HAVING (count(phrase) > 1)

私の質問は、手動で削除せずに重複エントリを削除するにはどうすればよいですか?上記のクエリを使用して、少なくとも1回は削除する必要があるエントリのリストを生成したいと思います。このように、テーブルfooには「phrase」のバージョンが1つだけ存在します。

4

4 に答える 4

2

これにより、フレーズごとに 1 つの行 (ID が最も小さい行) が保持されます。

DELETE FROM foo
WHERE id NOT IN (
    SELECT id FROM (
        SELECT MIN(id) id
        FROM foo
        GROUP BY phrase
    ) _
);

ダンがコメントで指摘したように、MySQL では奇妙な内部クエリが必要です。

于 2012-11-13T22:10:14.130 に答える
0

JOINを実行して、最初(最小)または最後(最大)の重複を削除するかどうかを決定できます。

DELETE phrase FROM phrase JOIN 
(SELECT max(id),COUNT(id) cnt from foo GROUP BY phrase 
HAVING cnt>1) AS dups 
ON phrase.id=dups.id

各レコードの複製が複数ある場合は、複数回実行する必要があります。

于 2012-11-13T22:13:32.317 に答える
0

以下を使用する必要があります。

SELECT max(id) from foo GROUP BY phrase HAVING (count(phrase) > 1)

削除する必要がある ID を確認します。

エントリを削除するには、次のようにします。

delete from foo where id in (select id from (SELECT max(id) from foo GROUP BY phrase HAVING (count(phrase) > 1)) foo);

delete ステートメントを複数回実行して、複数の重複を削除できます。

于 2012-11-13T22:07:42.630 に答える
0

一時テーブルを作成し、一意の値を追加し、重複した値を 1 つだけ追加してから、一時テーブルの名前を元のテーブルに変更する必要があります。

create table tmp like foo;

alter table tmp add unique (phrase);

insert into tmp select * from foo 
    on duplicate key update phrase=ifnull(phrase, values(phrase));

rename table foo to deleteme, tmp to foo;

drop table deleteme;
于 2012-11-13T22:12:39.613 に答える