2013-04-25 86 views
0

我有100万个,我需要找到重复,并且改变列的值,标记他们,但不删除该行加记录列表,而且还保留其他列的值。因此,举例来说:MySQL的查找重复,但合并列数据,而不删除行

id email  addr  city state zip phone  active 
1 [email protected] 1234 Street Denver, CO 80012 123-555-6789 1 
2 [email protected] BLANK BLANK BLANK, CO BLANK BLANK   1 

所以我需要保持第1行的列值,并切换第2行的活动字段为0,而不将其删除。这在MySQL中可行吗?需要稍微快一点,否则会使盒子崩溃,拥有100多万行。我可以使用PHP,但如果可能的话,MySQL只会更好。

+0

[你有什么尝试?](http://mattgemmell.com/2008/12/08/what-have-you-tried/)请参阅[关于堆栈溢出](http://stackoverflow.com/about )。 – 2013-04-25 19:56:47

+0

我有重复的名单,但我不能找到的东西,可以比较两行,要么选择一个正确的停用,或复制过来的数据。 – rncrtr 2013-04-25 19:58:21

回答

0

如果确定唯一性的唯一的事情是列电子邮件(这是由你的榜样建议),那么试试这个:

Update t set active= 0 
From Table t 
Where id != 
    (Select Min(id) From table 
     Where email = t.email) 

如果其他列也应被用来确定唯一性,然后inmclude那些在子查询的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]) 

要在您的评论处理的问题,如果有空白的领域,要收集多行数据,你有一个更复杂的问题。首先,可能有不止一行的值,而对于某些行可能不同于其他行。第二,如果你想将它们包括在测试的唯一性(有重复)的人口只有当它们,那么什么DIO做什么时,某些行有三列相同和不同的行集有一组不同的同列相同的值?

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 

那么您如何确定哪些行重复?这太复杂了,无法处理。如果你能在一组固定的列的解决被用来确定uniquenses/dupllicates,那么还有一个办法从其他多个行的一个聚集了其他列的数据值,你是在一个你离开停用active有一个空白值,但是如果用于确定唯一性/重复项的列可能不同(取决于实际的数据值),那么这些技术将不起作用。

+0

这是如何解释有数据的字段?他们并不总是在第一行,所以我需要确保它不会在情况下失去这些价值观,他们在2排 – rncrtr 2013-04-25 20:02:08

+0

如果有喜欢的地址每一行中的值,这是可行的。问题是我不知道是否有地址,但如果存在,我想保留它,所以查询需要基于存在要停用的行的数据做出动态决定。 – rncrtr 2013-04-25 20:07:31

+0

如果有超过一排用相同的电子邮件地址数据,做你想做的第一项,最近的一个或多个条目被合并为一个新的项目? – 2013-04-25 20:08:42