1

mysqlテーブルがあります。ヘッダーは次のように構成されています。

フィールドフィールドフィールドフィールドベンダー
データデータデータデータデータデータデータデータデータデータデータデータデータデータデータ
2データデータデータデータデータ
2データデータデータデータ
データ
2

ここで、同じベンダー値を共有する行の重複行を削除します。したがって、同じであるがベンダー列の値が異なる2つの行は、重複していると見なされるべきではありません。ただし、同じベンダー値に等しく、同じベンダー値を共有する2つ以上の行は重複していると見なされるため、既存のコピーを1つだけ残して削除する必要があります。

mysqlを使用してこれをどのように行うことができますか?

私はこのようなことをしましたが、重複する値だけでなくすべてを削除します。少なくとも1つのコピーを残したい。

DELETE

FROM auto WHERE((auto.email ='carolzvalentine@yahoo.com')AND(auto.vendors = '5552'))

4

2 に答える 2

1

UNIQUE次を使用して、テーブルの列にインデックスを追加できALTER IGNOREます。

ALTER IGNORE TABLE mytbl ADD UNIQUE INDEX (field1, field2, field3, field4, vendors)

マニュアルで説明されているように:

IGNORE標準SQLのMySQL拡張です。これはALTER TABLE、新しいテーブルの一意のキーに重複がある場合、または厳密モードが有効になっているときに警告が発生した場合の動作を制御します。指定されていない場合IGNORE、重複キーエラーが発生すると、コピーは中止され、ロールバックされます。が指定されている場合IGNORE、一意のキーに重複する行の最初の行のみが使用されます。他の競合する行は削除されます。誤った値は、最も一致する許容値に切り捨てられます。

これにより、将来重複が追加されるのを防ぐこともできます(これを許可する場合はDROP、作成後にインデックスを作成できます)。

于 2012-07-31T15:45:19.123 に答える
0
"DELETE x
 FROM $table x
 LEFT
 JOIN
 ( SELECT vendors
        , email
        , MIN(lead_id) min_lead_id
     FROM $table
    GROUP
       BY vendors
        , email
 ) y
ON y.vendors = x.vendors
AND y.email = x.email
AND y.min_lead_id = x.lead_id
WHERE x.vendors = $vendor
AND y.min_lead_id IS NULL;";

これでうまくいきます。そのコードのphp変数を正しい値に置き換えるだけです。

$vendor=ベンダー列の
名前$table=テーブルの名前

このコードの唯一の問題は、完全に最適ではないことです。25,000のレコードセットがあり、仮想専用サーバーで実行されている場合、平均2分でタスクを完了します。

乾杯

于 2012-08-05T16:37:07.627 に答える