簡體   English   中英

MySQL查找重復項,但合並列數據而不刪除行

[英]MySQL find duplicates but coalesce column data without deleting rows

我有一百萬條記錄的列表,這些記錄需要查找重復項,並更改列的值,對其進行標記,而不刪除該行,但還要保留其他列的值。 因此,例如:

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中可行嗎? 需要有點快,否則它將使盒子崩潰,超過一百萬行。 我可以使用PHP,但如果可能的話,僅MySQL會更好。

如果唯一確定唯一性的是列電子郵件(如您的示例所建議),請嘗試以下操作:

 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具有空白值,但是如果用於確定唯一性/重復項的列可以不同(取決於實際數據值),則這些技術將不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM