重複の可能性:
SQL で重複行を削除するには?
レコードを含むテーブルがあり、すべての重複レコードを削除したい
DELETE FROM 'table'
WHERE 'field' IN
(
SELECT 'field' FROM 'table' GROUP BY 'field'
HAVING (COUNT('field')>1)
)
なぜこれが機能しないのですか?
重複の可能性:
SQL で重複行を削除するには?
レコードを含むテーブルがあり、すべての重複レコードを削除したい
DELETE FROM 'table'
WHERE 'field' IN
(
SELECT 'field' FROM 'table' GROUP BY 'field'
HAVING (COUNT('field')>1)
)
なぜこれが機能しないのですか?
たぶんDISTINCT
、フィールドに基づいて一意のレコードのみを選択するコマンドを使用して探索できます。
ベースの一意のエントリを使用して新しいテーブルを作成できます。例として...
CREATE TABLE nonDuplicates
SELECT DISTINCT * FROM yourTable group by field
これにより、複数の結果が得られます:-
SELECT field FROM `table`
GROUP BY field
HAVING (COUNT('field)>1
これを次の方法で変更してみてください。
SELECT TOP 1 field
FROM `table`
GROUP BY field
HAVING (COUNT(field)>1
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;
最初にすべての重複を取得し、それらを配列に格納します。
SELECT field
FROM `table`
GROUP BY field
HAVING COUNT('field') > 1
phpを実行して、必要な結果を1つ保存してから実行します
DELETE
FROM `table`
WHERE field IN (your values) AND field != savedID