MySQL查找重复项但合并列数据而不删除行

时间:2013-04-25 19:55:22

标签: php mysql sql

我有一个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只会好得多。

1 个答案:

答案 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有一个空值,但是如果要用于确定唯一性/重复项的列可能不同(取决于实际数据值),那么这些技术将不起作用。