2013-04-25 88 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