在MYSQL中更新重复行以进行逻辑删除

时间:2017-11-08 04:02:22

标签: mysql duplicates updates

我已经看过一些关于删除/更新重复行的其他帖子,但我对如何正确应用它来解决我的特定困境感到有些困惑。

希望有人能给我一个正确的方向。

我有一个表格,上面有一些重复的行,并希望通过将isdeleted列设置为1来为每个用户逻辑删除它们。

我的表有一个名为Id的主键,它是一个无符号的bigint,它有一个名为cid的列,它代表另一个重复的id。 cid在用户与用户之间不是唯一的,但对于特定用户而言应该是唯一的。

例如,你可以在我的表中看到这个:

id | cid | userid | is_deleted
1  | 1   | 100    | 0
2  | 2   | 101    | 0
3  | 1   | 102    | 0
4  | 1   | 100    | 0
5  | 2   | 101    | 0

因此,在这种情况下,用户#100有两个相同的CID - 记录#1和记录#4。类似地,用户#101有两个相同的CID - 记录#2和记录#5

我想做的只是为给定用户获取重复的CID并将is_deleted设置为1,而不是清除实际的行。我想保留一条记录为is_deleted = 0,这样就可以保留一些记录。

所以我希望的输出是:

id | cid | userid | is_deleted
1  | 1   | 100    | 0
2  | 2   | 101    | 0
3  | 1   | 102    | 0
4  | 1   | 100    | 1
5  | 2   | 101    | 1     

我可以在代码中执行此操作,但它会更加复杂,并且我已经看到了对纯SQL语句的一些惊人的响应;有人能提出一些建议或提供解决方案吗?

非常感谢!

1 个答案:

答案 0 :(得分:0)

您可以使用以下查询来更新N个重复条目中的1行

Update table t
inner join
(select id from table group by userid,cid having count(1)>1) t1
on t1.id = t.id
set t.is_deleted=1;