2012-02-16 4 views
1

У меня есть таблица в моей базе данных для хранения пользовательских данных. Я обнаружил дефект в коде, который добавляет данные в эту базу данных таблиц, где, если происходит тайм-аут сети, код обновил данные следующего пользователя с данными предыдущего пользователя. Я исправил этот дефект, но мне нужно очистить базу данных. Я добавил флаг, чтобы указать строки, которые нужно игнорировать, и моя цель - пометить эти флаги соответственно для дубликатов. Однако в некоторых случаях дублирующиеся значения могут быть законными, поэтому меня больше интересует поиск нескольких пользователей с одинаковыми данными (т. Е. U> 2).Удаление повторяющихся записей пользователя из таблицы базы данных mySQL

Вот пример (имя_таблицы = Данные):

ID ---- идентификатор_пользователя ---- ---- data1 data2 ---- ---- данные3 DateTime ----- ------ флаг

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 был исходным datapoint (при условии, что самые старые даты указаны ранее в списке).

На данный момент в таблице так много записей в таблице, что я не уверен, что лучший способ идентифицировать пользователей, имеющих дубликаты записей.

Я ищу команду mysql, чтобы сначала идентифицировать данные проблемы, а затем я смогу отметить записи. Может ли кто-нибудь вести меня в правильном направлении?

ответ

0

Ну, сначала выберите дублированные данные с их мин идентификатор пользователя:

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); 
Смежные вопросы