0

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

4

1 回答 1

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

于 2013-04-25T20:00:19.090 回答