2017-08-28 4 views
0

これを明確に説明できます。私は、グループ内の人々の一意のIDである必要があるテーブルを持っています。 IDは、最初の3文字の名前と生年月日を使用して生成されます。通常、小グループ(500未満)ではこれがうまく動作します。しかし、大規模なグループでは、いくつかの重複が発生します。次に重複するIDに-1、-2、-3などを追加します。たとえば:一致する一致基準に基づいて重複IDを更新するMySQLを1つのテーブルにまとめて

ID GROUP   UID   FIRST_NAME 
1  123456   ALE1990ALEXIS 
2  123456   ALE1990ALEXANDER 
3  123456   ALE1990ALEJANDRO 
4  789789   ALE1990ALEX 

私は何をしたいのは、ID 2および3のための追加-1および-2、それぞれ自分のUIDフィールドに1,2および3は、今(GROUP + UID)一意になるように。 IDは2と3のため= 1 DUPLICATE_RECORDフィールドを設定するしかし、私はまだする必要がある場合

UPDATE table A 
    JOIN table B 
    ON B.GROUP = A.GROUP 
    AND B.UID = A.UID 
    AND B.FIRST_NAME <> A.FIRST_NAME 
    AND B.ID < A.ID 
    SET A.duplicate_record = 1; 

:GROUPは、私はこのような何かを始めました

異なるため、ID 4が無視されるだろうそれらのUIDに-1、-2、-3などを付け加えてください。どうやってそれを行うのか分かりません。たぶん、重複のフラグ= 1を設定するのではなく、重複しているレコードの数を設定する必要がありますか?

+1

おそらく、IDを解析して追加をチェックするのは簡単でしょう。存在する場合は、それをintとしてキャストし、1を追加して、再度追加して更新します。もちろん、それが存在しない場合は、1を追加することができます。 –

+0

*常に* IDを追加すると、UIDはグループに関係なく常に一意であることが保証されます。 – kmoser

答えて

1

group, UIDタプルが一意である場合には(そしてそれがあるべき)、なぜinsert ignore(追加の任意の値なし)最初の1、SELECT ROW_COUNT();の影響を受け、それがゼロの場合、-1を追加した行数を確認しますか? for cycle(擬似コード)に入れた場合:

while i < 1000 do 
    insert ignore into people (group, uid, first_name) values (123456, concat(their_uid, "-", i), first name); 
    if ((select row_count();) == 1): 
     break; 
    i=i+1; 
end while; 
+0

私はそれがMySqlの外で行ったことにかなり近いので、それを受け入れたものとしてタグ付けしました。私はちょうどこれらのIDを解析し、正しい-1、-2などを追加するために解雇されることができる簡単なスクリプトを書いてありがとう! – Steve

関連する問題