2016-03-29 6 views
0

У меня есть таблица с столбцами userID, sectionId, usersectionID, valid. Этот допустимый столбец используется для идентификации повторяющихся записей. Но некоторые дубликаты записей смешались в допустимом столбце.Поиск дубликатов записей и обновление столбца - Mysql

select userID, sectionId, count(*) as cnt from table where valid = 1 group by 1,2 having cnt >1 ; 

Это покажет мне список комбинаций идентификаторов userID и sectionID, дублирующих записи. Если комбинация userid и sectionID имеет более 1 записи, значит, это дубликат.

Например, это может быть выход,

userId  SectionID  Cnt 
1    4    3 

Теперь, когда мы видим это в дальнейшем,

Select userId, sectionId, usersectionID, valid from table where userID = 1 and sectionID = 4; 

userID  sectionID usersectionID valid 
1    4   3    1 
1    4   5    1 
1    4   10   1 

Я хочу, чтобы обновить действующий столбец с 0 для всех записей, кроме минимума usersectionID , Результат после этого запроса должен быть

userID  sectionID usersectionID valid 
1    4   3    1 
1    4   5    0 
1    4   10   0 

Я хочу сделать это для полной таблицы в одном запросе. Я пробовал это в течение долгого времени с большим успехом. Может ли кто-нибудь помочь мне в решении этого? или может даже дать какую-то идею сделать это?

Благодаря

ответ

1

использовать UPDATE с автообъединение найти дубликаты, которые должны быть отмечены как недействительные.

UPDATE table AS t1 
JOIN (SELECT userID, sectionID, MIN(usersectionID) AS minusersectionID 
     FROM table 
     WHERE valid = 1 
     GROUP BY userID, sectionID) AS t2 
ON t1.userID = t2.userID AND t1.sectionID = t2.sectionID AND t1.usersectionID != t2.minusersectionID 
SET t1.valid = 0 
WHERE t1.VALID = 1 
+0

Wow .. Thats очень хороший запрос .. Спасибо большое! – Observer

1

Вы можете использовать любой из следующих подходов.

Обновление на основе минимума

Update TableName 
JOIN (
    SELECT userID, sectionID, MIN(userSectionID) AS minuserSectionID 
    FROM TableName 
    GROUP BY userID, sectionID 
) AS T 
Set Valid = 1 
WHERE 
TableName.userID = T.userID 
AND TableName.sectionID = T.sectionID 
AND TableName.userSectionID = T.minuserSectionID; 

ИЛИ ИСПОЛЬЗОВАТЬ Обновление на основе ранговых 1 значения

SET @rank=0; 
Update TableName 
JOIN (
    SELECT userID, sectionID, @rank:[email protected]+1 AS rownumber 
    FROM TableName 
    GROUP BY userID, sectionID 
) AS T 
Set Valid = 1 
WHERE 
TableName.userID = T.userID 
AND TableName.sectionID = T.sectionID 
AND T.rownumber = 1; 
Смежные вопросы