47

私はこれについて多くのバリエーションを見てきましたが、私が達成しようとしていることと完全に一致するものはありません。

TableA構成可能な質問票に対するユーザーからの回答を含む表があります。列はmember_id, quiz_num, question_num, answer_numです。

どういうわけか、数人のメンバーが回答を2回提出しました。したがって、重複したレコードを削除する必要がありますが、1行が残されていることを確認してください。

プライマリ列がないため、まったく同じデータを持つ2つまたは3つの行が存在する可能性があります。

すべての重複を削除するクエリはありますか?

4

9 に答える 9

102

テーブルに一意のインデックスを追加します。

ALTER IGNORE TABLE `TableA`   
ADD UNIQUE INDEX (`member_id`, `quiz_num`, `question_num`, `answer_num`);

これを行う別の方法は次のとおりです。

テーブルに主キーを追加すると、次のクエリを使用してテーブルから重複を簡単に削除できます。

DELETE FROM member  
WHERE id IN (SELECT * 
             FROM (SELECT id FROM member 
                   GROUP BY member_id, quiz_num, question_num, answer_num HAVING (COUNT(*) > 1)
                  ) AS A
            );
于 2012-12-27T06:49:13.123 に答える
15

の代わりにdrop table TableA、すべてのレジスタ(delete from TableA;)を削除してから、元のテーブルにTableA_Verify(insert into TAbleA select * from TAbleA_Verify)からのレジスタを入力することができます。このようにして、元のテーブルへのすべての参照(インデックス、。。。)が失われることはありません。

CREATE TABLE TableA_Verify AS SELECT DISTINCT * FROM TableA;

DELETE FROM TableA;

INSERT INTO TableA SELECT * FROM TAbleA_Verify;

DROP TABLE TableA_Verify;
于 2013-10-22T17:12:12.797 に答える
13

これはTEMPテーブルを使用しませんが、代わりに実際のテーブルを使用します。問題が一時テーブルに関するものであり、テーブルの作成や削除に関するものではない場合、これは機能します。

SELECT DISTINCT * INTO TableA_Verify FROM TableA;

DROP TABLE TableA;

RENAME TABLE TableA_Verify TO TableA;
于 2012-12-26T22:53:41.420 に答える
8

上記の答えをくれたjveirasvに感謝します。

特定の列セットの重複を削除する必要がある場合は、これを使用できます(たとえば、テーブルに異なるタイムスタンプがある場合)

CREATE TABLE TableA_Verify AS SELECT * FROM TableA WHERE 1 GROUP BY [COLUMN TO remove duplicates BY];

DELETE FROM TableA;

INSERT INTO TableA SELECT * FROM TAbleA_Verify;

DROP TABLE TableA_Verify;
于 2014-04-01T12:58:11.470 に答える
7

テーブルに一意のインデックスを追加します。

ALTER IGNORE TABLE TableA   
ADD UNIQUE INDEX (member_id, quiz_num, question_num, answer_num);

非常にうまく機能しています

于 2014-04-02T08:15:36.663 に答える
3

主キーを使用していない場合は、次のクエリを1回のストロークで実行します。値を置き換えることにより:

# table_name - Your Table Name
# column_name_of_duplicates - Name of column where duplicate entries are found

create table table_name_temp like table_name;
insert into table_name_temp select distinct(column_name_of_duplicates),value,type from table_name group by column_name_of_duplicates;
delete from table_name;
insert into table_name select * from table_name_temp;
drop table table_name_temp
  1. 一時テーブルを作成し、個別の(重複しない)値を保存します
  2. 空の元のテーブルを作成します
  3. 一時テーブルから元のテーブルに値を挿入します
  4. 一時テーブルを削除する

データベースを操作する前に、データベースのバックアップを取ることを常にお勧めします。

于 2015-02-24T13:06:18.340 に答える
1

コメントに記載されているように、アイテムが複数回重複している場合は、SaharshShahの回答のクエリを複数回実行する必要があります。

これは、データを削除せず、データを常に元のテーブルに保持し、テーブルを「ライブ」に保ちながら重複を削除できるようにするソリューションです。

alter table tableA add column duplicate tinyint(1) not null default '0';

update tableA set
duplicate=if(@member_id=member_id
             and @quiz_num=quiz_num
             and @question_num=question_num
             and @answer_num=answer_num,1,0),
member_id=(@member_id:=member_id),
quiz_num=(@quiz_num:=quiz_num),
question_num=(@question_num:=question_num),
answer_num=(@answer_num:=answer_num)
order by member_id, quiz_num, question_num, answer_num;

delete from tableA where duplicate=1;

alter table tableA drop column duplicate;

これは基本的に、現在の行が最後の行と同じであるかどうかを確認し、同じである場合は重複としてマークします(orderステートメントは重複が隣り合って表示されることを保証します)。次に、重複するレコードを削除します。最後の列を削除しduplicateて、元の状態に戻します。

また、alter table ignoreすぐになくなる可能性があるようです:http ://dev.mysql.com/worklog/task/?id=7395

于 2015-09-08T21:01:07.027 に答える
1

別の方法は、同じ構造の新しい一時テーブルを作成することです。

CREATE TABLE temp_table AS SELECT * FROM original_table LIMIT 0

次に、テーブルに主キーを作成します。

ALTER TABLE temp_table ADD PRIMARY KEY (primary-key-field)

最後に、重複するレコードを無視して、元のテーブルからすべてのレコードをコピーします。

INSERT IGNORE INTO temp_table AS SELECT * FROM original_table

これで、元のテーブルを削除して、新しいテーブルの名前を変更できます。

DROP TABLE original_table
RENAME TABLE temp_table TO original_table
于 2016-01-21T05:41:51.283 に答える
1

mysql5でテスト済み。他のバージョンについては知らない。id値が最小の行を保持する場合:

DELETE n1 FROM 'yourTableName' n1, 'yourTableName' n2 WHERE n1.id > n2.id AND n1.member_id = n2.member_id and n1.answer_num =n2.answer_num

ID値が最も高い行を保持する場合:

DELETE n1 FROM 'yourTableName' n1, 'yourTableName' n2 WHERE n1.id < n2.id AND n1.member_id = n2.member_id and n1.answer_num =n2.answer_num
于 2020-08-16T07:02:13.520 に答える