0

重複を見つけて列の値を変更し、行を削除せずにフラグを立てて、他の列の値を保持する必要がある 100 万以上のレコードのリストがあります。たとえば、次のようになります。

id email     addr        city   state zip phone        active
1  me@me.com 1234 Street Denver, CO 80012 123-555-6789 1
2  me@me.com BLANK BLANK BLANK, CO BLANK BLANK         1

したがって、行 1 の列の値を保持し、行 2 のアクティブ フィールドを削除せずに 0 に切り替える必要があります。これはMySQLで実行できますか? 100万以上の行があると、ボックスがクラッシュします。私は PHP を使用できますが、できれば MySQL だけの方がはるかに優れています。

4

1 に答える 1

0

一意性を決定する唯一のものがメール列である場合(例で示唆されているように)、これを試してください:

 Update t set active= 0
 From Table t
 Where id !=
     (Select Min(id) From table
      Where email = t.email)

一意性を判断するために他の列も使用する必要がある場合は、それらをサブクエリの where 句に含めます。

 Update t set active= 0
 From Table t
 Where id !=
     (Select Min(id) From table
      Where email = t.email
         And addr = t.addr
         And [Other columns])

コメントの問題に対処するには、空白のフィールドがあり、複数の行からデータを収集したい場合、はるかに複雑な問題があります。まず、値を持つ複数の行が存在する可能性があり、一部の行で他の行と異なる場合があります。第 2 に、データが入力されている場合にのみ一意性 (重複の場合) のテストにそれらを含めたい場合、一部の行に同じ 3 つの列があり、別の行のセットに別の列のセットがある場合に何をしますか?同じ値?

 id    addr   city    state    zip     phone 
  1     X     Denver   CO     71113    Blank
  2     Y     Blank    CO     Blank    212.901-3456
  3     X     Denver   TX     Blank    Blank
  4     Y     ElPaso   TX     Blank    212.901-3456
  5     X     ElPaso   Blank  71113    Blank    
  6     Y     ElPaso   Blank  Blank    212.901-3456

次に、どの行が重複しているかをどのように判断しますか? これは複雑すぎて対処できません。一意性/重複を判断するために使用される列の固定セットに落ち着くことができれば、他の複数の行の1つから他の列のデータ値を収集する方法があります。 active には空白の値がありますが、一意性/重複を判断するために使用される列が異なる可能性がある場合 (実際のデータ値によって異なります)、これらの手法は機能しません。

于 2013-04-25T20:00:19.090 に答える