2012-02-16 16 views
1

ユーザーデータを格納するデータベースがデータベースにあります。このテーブルデータベースにデータを追加するコードに欠陥がありました。ネットワークタイムアウトが発生した場合、コードは次のユーザーのデータを前のユーザーのデータで更新しました。私はこの欠陥に対処しましたが、私はデータベースをきれいにする必要があります。私は、無視する必要がある行を示すためにフラグを追加しました。私の目標は、これらのフラグを重複に応じてマークすることです。ただし、重複した値が実際に正当なものになる場合があるため、同じデータ(つまりu> 2)を持つ複数のユーザーを見つけることにもっと興味があります。mySQLデータベーステーブルから重複するユーザーエントリを削除する

ここ例です(テーブル名=データ):

ID ---- USER_ID ---- ---- DATA1、DATA2、DATA3 ---- ----日時----- ------ flag

1 ----- usr1 -------- 3 ---------- 2 --------- 2-- ------- 2012-02-16 ..----- 0

2 ----- usr2 -------- 3 ---------- 2 --------- 2 --------- 2012-02-16 ..----- 0

3 ----- usr3 ------ - 3 ---------- 2 --------- 2 --------- 2012-02-16 ..----- 0

この場合、1と2のidフラグに1(無視することを示す)をマークしたいと思います。 usr1が元のデータポイントであったことを知っているから(最も古い日付がリストの前にあると仮定して)

この時点では、テーブルには非常に多くのエントリがあり、重複したエントリを持つユーザを識別するための最良の方法はわかりません。

問題のデータを最初に特定するためのmysqlコマンドを探していますが、次にそのエントリにマークを付けることができます。誰かが正しい方向に私を導くことができますか?

答えて

0

さて、最初にその分のユーザーIDと重複するデータを選択します。

CREATE TEMPORARY TABLE duplicates 
    SELECT MIN(user_id), data1,data2,data3 
    FROM data 
    GROUP BY data1,data2,data3 
    HAVING COUNT(*) > 1      -- at least two rows 
    AND COUNT(*) = COUNT(DISTINCT user_id) -- all user_ids must be different 
    AND TIMESTAMPDIFF(MINUTE, MIN(`datetime`), MAX(`datetime`)) <= 45; 

を(私はきちんとTIMESTAMPDIFFを使用した場合、私は、よく分からない。)user_idがどこにある は、今、私たちはそれらの行のフラグを更新することができます異なる:

UPDATE  duplicate 
INNER JOIN data  ON data.data1 = duplicate.data1 
        AND data.data2 = duplicate.data2 
        AND data.data3 = duplicate.data3 
        AND data.user_id != duplicate.user_id 
SET data.flag = 1; 
+0

ありがとうございます。これは正しいアプローチのようです。私はいくつかの重複を見ることができますが、ユーザー間ではありません - 私は大丈夫です同じユーザーの間で重複データが表示されます。私は、同じデータを複数の異なるユーザが同じ時間枠で(数分から45分以内に)持っていることにもっと関心を持っています。これは簡単にできますか? – user836200

+0

こんにちは、私は私の答えを更新しました、うまくいけばそれはあなたを助けます。 – biziclop

+0

ありがとう!これは大いに役立ちます! – user836200

0
UPDATE Data A 
LEFT JOIN 
(
    SELECT user_id,data1,data2,data3,min(id) min_id 
    FROM Data GROUP BY user_id,data1,data2,data3 
) B 
ON A.id = B.min_id 
SET A.flag = IF(ISNULL(B.min_id),1,0); 

関与重複時間がある場合は、多分これ

を試してみてください
UPDATE Data A 
LEFT JOIN 
(
    SELECT user_id,data1,data2,data3,,`datetime`,min(id) min_id 
    FROM Data GROUP BY user_id,data1,data2,data3,`datetime` 
) B 
ON A.id = B.min_id 
SET A.flag = IF(ISNULL(B.min_id),1,0); 
関連する問題