Удаление повторяющихся записей пользователя из таблицы базы данных mySQL - PullRequest
1 голос
/ 16 февраля 2012

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

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

id ---- user_id ---- data1 ---- data2 ---- data3 ---- 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 как 1 (для обозначения игнорирования). Поскольку мы знаем, что usr1 был исходной точкой данных (при условии, что самые старые даты находятся в списке ранее).

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

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

Ответы [ 2 ]

0 голосов
/ 16 февраля 2012
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);
0 голосов
/ 16 февраля 2012

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

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;
...