我有一个100多个记录的列表,我需要找到重复项,并更改列的值,标记它们,而不删除行,但也保留其他列值。所以,例如:
id email addr city state zip phone active
1 me@me.com 1234 Street Denver, CO 80012 123-555-6789 1
2 me@me.com BLANK BLANK BLANK, CO BLANK BLANK 1
所以我需要保留第1行的列值,并将第2行的活动字段切换为0,而不删除它。这在MySQL中可行吗?需要有点快,否则会崩溃盒子,有100万+行。我可以使用PHP,但如果可能的话,MySQL只会好得多。
答案 0 :(得分:0)
如果确定唯一性的唯一因素是列电子邮件(如您的示例所示),请尝试以下操作:
Update t set active= 0
From Table t
Where id !=
(Select Min(id) From table
Where email = t.email)
如果还应该使用其他列来确定唯一性,那么请在子查询where子句中包含那些:
Update t set active= 0
From Table t
Where id !=
(Select Min(id) From table
Where email = t.email
And addr = t.addr
And [Other columns])
要处理评论中的问题,如果有空白字段,并且您想要从多行收集数据,则会遇到更复杂的问题。首先,可能有多个行具有值,然后某些行可能与其他行不同。其次,如果你想在它们被填充时将它们包含在你的唯一性测试中(对于重复项),那么当一些行有三列相同而另一组不同的行具有不同的列集时,你会做什么。相同的价值?
id addr city state zip phone
1 X Denver CO 71113 Blank
2 Y Blank CO Blank 212.901-3456
3 X Denver TX Blank Blank
4 Y ElPaso TX Blank 212.901-3456
5 X ElPaso Blank 71113 Blank
6 Y ElPaso Blank Blank 212.901-3456
然后如何确定哪些行是重复的?这太复杂了,无法处理。如果您可以使用固定的一组列来确定单一序列/重复项,那么有一种方法可以从您要离开的那一行中取消其他多行中的其他列之一来收集其他列的数据值active有一个空值,但是如果要用于确定唯一性/重复项的列可能不同(取决于实际数据值),那么这些技术将不起作用。