2016-06-27 5 views
-2

「電子メール」列がUNIQUEではないユーザーテーブルがあります。残念ながら、電子メールが重複しているレコードがあります。重複した電子メールを別の値に更新する

"電子メール"列がUNIQUEである別のユーザーテーブルにこのテーブルをインポートする必要があります。

重複した電子メールを別の値に更新して重複がなくなると思っています。

たとえば、同じ電子メール "[email protected]"を持つレコードが3つあるとします。次に、それらの1つを保持し、他の2つを "[email protected] [ランダムな文字列]"のようなものに更新します。

これを達成するにはどのようなSQL文を実行する必要がありますか?ありがとう!

EDIT:テストゴードンの解決のための

表 -

enter image description here

結果 -

enter image description here

+0

...これは生産でますか? –

+0

[Distinct](http://dev.mysql.com/doc/refman/5.7/en/distinct-optimization.html) – MrCleanX

+0

この表に 'auto_increment'がありますか?そのテーブルのバックアップを取得します。また、あなたの変更が違反しているかどうか、FKが適切かどうかを判断してください。データを修正し、使用されていない複製ファイルを削除します。 'email'のためにユニークな鍵を置く – Drew

答えて

2

あなたが使用できる変数:

select concat(u.email, 
       (case when @e = email then concat('[', @rn := @rn + 1, ']') 
        when (@e := email) is null then '' -- never happens 
        when (@rn := 1) is null then '' -- never happens 
        else '' 
       end)) 
from users u cross join 
    (select @e := '', @rn := 0) params 
order by u.email; 

EDIT:

うーん、上記のSQLフィドルでは動作しませんでしたが、このバージョンdoes:あなたはちょうどあなたのユーザーを失うている

select concat(u.email, 
       if(@e = u.email, concat('[', @rn := @rn + 1, ']'), 
       if(@e := u.email, if(@rn := 1, '', ''), '') 
       ) 
      ), @e, @rn 
from users u cross join 
    (select @e := '', @rn := 0) params 
order by u.email; 
+0

それは私にエラーを与えました: 'あなたはあなたのSQL構文に誤りがあります。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックして、右側の構文を使用してください。 'test 9u cross join'(@e:= ''、@ rn:= 0を選択してください)params order by u.email 'at line 7' – Shawn

+0

ところで、私はあなたがこれまで使ってきた埋め込み 'if'文よりも、このアプローチが好きです。何が起こっているのかを理解するためにはるかに洗練されています(さらに、1つの節でrnを設定します)。 – sgeddes

+0

ありがとうございますが、これはまだあります: '操作' = ''のための'不正な組み合わせの照合(utf8_general_ci、IMPLICIT)と(utf8_unicode_ci、IMPLICIT)' – Shawn

関連する問題