2013-10-18 56 views
0

我一直在研究基於特定字段查找重複行的正確方法。我想我需要更多一點的幫助 -MySQL - 將重複行添加到歸檔表中,然後刪除重複行

SELECT * 
    FROM enrollees 
    INNER JOIN (SELECT first_name, last_name, address1, city, state, zip, program_instance_id, MIN(id) AS MinId, COUNT(id) AS count FROM enrollees GROUP BY first_name, last_name, address1, city, state, zip, program_instance_id) b 
    ON enrollees.first_name = b.first_name 
     AND enrollees.last_name = b.last_name 
     AND enrollees.address1 = b.address1 
     AND enrollees.city = b.city 
     AND enrollees.state = b.state 
     AND enrollees.zip = b.zip 
     AND count > 1 
     AND enrollees.program_instance_id = b.program_instance_id 
     AND enrollees.id != MinId; 

的目標是採取複製,並把它們存檔表(enrollees_duplicates),然後從直播表中刪除重複的(參保)。我試着寫一個查詢來查找和插入重複的行,但它給了我下面的錯誤:

「列數並不在行1匹配值計數」

我嘗試使用的查詢是:

INSERT INTO enrollees_duplicates (SELECT * 
    FROM enrollees 
    INNER JOIN (SELECT first_name, last_name, address1, city, state, zip, program_instance_id, MIN(id) AS MinId, COUNT(id) AS count FROM enrollees GROUP BY first_name, last_name, address1, city, state, zip, program_instance_id) b 
    ON enrollees.first_name = b.first_name 
     AND enrollees.last_name = b.last_name 
     AND enrollees.address1 = b.address1 
     AND enrollees.city = b.city 
     AND enrollees.state = b.state 
     AND enrollees.zip = b.zip 
     AND count > 1 
     AND enrollees.program_instance_id = b.program_instance_id 
     AND enrollees.id != MinId); 

我認爲這是因爲我沒有檢索INNER JOIN select中的所有列?如果是這樣的話,如果我將它更改爲SELECT *(使用MinId和count增加),它會不會拋出相同的錯誤,因爲在新表中不存在兩個額外的列?

有什麼辦法可以用SQL查詢完成所有的工作,而不必選擇重複項,將它們存儲在PHP數組中,然後使用另一個SQL查詢來拉取每一行,將其插入到重複表中,然後另一個 SQL查詢刪除重複行。

我的意圖是使用兩個查詢。一個用於將所有重複行插入到存檔表中,另一個用於刪除重複行。如果它可以以某種方式被製作成一個查詢來查找重複項,將它們插入到存檔表中,然後刪除它們 - 所有這一切都會在一次運行中更好。

作爲新來的這個領域,任何幫助或指導,將不勝感激。

+0

建議 - 請看看您是否可以保留您的問題描述的重點,這有助於甚至鼓勵人們試圖幫助您。 – Vishal

+0

我只是想徹底。解釋我的目標是什麼以及我要走什麼路線,以防出現一個更好,更有效的方法。對不起,如果它看起來像散漫,我只是想盡可能多地提供信息,所以沒有人需要更多。 –

回答

0

我的問題的解決方案是,當我的第一個選擇只是'*'時,它將兩個附加列(MinId,count)添加到使列計數不同的結果中。通過只抓取'enrollees'表的結果而不是子查詢的附加參數,它可以糾正列差異。

INSERT INTO enrollees_duplicates (SELECT enrollees.* 
    FROM enrollees 
    INNER JOIN (SELECT first_name, last_name, address1, city, state, zip, program_instance_id, MIN(id) AS MinId, COUNT(id) AS count FROM enrollees GROUP BY first_name, last_name, address1, city, state, zip, program_instance_id) b 
    ON enrollees.first_name = b.first_name 
     AND enrollees.last_name = b.last_name 
     AND enrollees.address1 = b.address1 
     AND enrollees.city = b.city 
     AND enrollees.state = b.state 
     AND enrollees.zip = b.zip 
     AND count > 1 
     AND enrollees.program_instance_id = b.program_instance_id 
     AND enrollees.id != MinId);