5

重複の可能性:
SQL で重複行を削除するには?

レコードを含むテーブルがあり、すべての重複レコードを削除したい

DELETE FROM 'table'
WHERE 'field' IN 
(
SELECT 'field' FROM 'table' GROUP BY 'field'
HAVING (COUNT('field')>1)
)

なぜこれが機能しないのですか?

4

4 に答える 4

6

たぶんDISTINCT、フィールドに基づいて一意のレコードのみを選択するコマンドを使用して探索できます。

ベースの一意のエントリを使用して新しいテーブルを作成できます。例として...

CREATE TABLE nonDuplicates  
SELECT DISTINCT * FROM yourTable group by field
于 2013-01-31T15:10:40.220 に答える
1

これにより、複数の結果が得られます:-

SELECT field FROM `table`
GROUP BY field
HAVING (COUNT('field)>1

これを次の方法で変更してみてください。

SELECT TOP 1 field
FROM `table`
GROUP BY field 
HAVING (COUNT(field)>1
于 2013-01-31T14:56:59.230 に答える
0

MySQLには非常に厄介な制限があり、副選択で更新/削除/挿入されているテーブルを使用できません。

ただし、(副選択を使用する代わりに)削除するテーブルを結合することで、これを回避できます。

テーブルにある種の一意の識別子があると仮定します(id次のステートメントの列を想定しています)。

DELETE d 
FROM table_with_duplicates d 
JOIN ( 
   SELECT min(id) as min_id, field
   FROM table_with_duplicates 
   GROUP BY field
) keep ON keep.field = d.field
      AND keep.min_id <> d.id; 

これにより、重複ごとに1つの行が保持されます(列に最低値がある行id)。

重複するすべての行を削除する場合(少なくとも1つは保持しない)、AND keep.min_id <> d.id条件を削除するだけです。

編集

一意の列がないが、すべての重複を削除したい場合(少なくとも1つの行を保持しない場合)、次を使用できます。

DELETE d 
FROM table_with_duplicates d 
JOIN ( 
   SELECT field
   FROM table_with_duplicates 
   GROUP BY field
   HAVING count(*) > 1
) del ON del.field = d.field;
于 2013-01-31T15:10:21.450 に答える
0

最初にすべての重複を取得し、それらを配列に格納します。

SELECT field 
FROM `table`
GROUP BY field
HAVING COUNT('field') > 1

phpを実行して、必要な結果を1つ保存してから実行します

DELETE 
FROM `table`
WHERE field IN (your values) AND field != savedID
于 2013-01-31T15:09:02.850 に答える