2011-03-14 61 views
3

我有一個這樣的表。查找重複的mysql記錄,並更新與上次重複值的第一個副本

ID Name  Tag  
1  Orange tea  
2  Pear  light  
3  Apple tea 
4  Juice tea 
5  Cocoa baseball 
6  Camera baseball 

我想要做的是有重複的代碼行,我想用最新的occurence第一次出現的名稱。

所以在上面的例子中,我想將ID 1的名稱從Orange更新爲Juice並刪除其他(#3,#4) 並將ID 5從Cocoa更新爲Camera並刪除#6。

我該怎麼做,用MySQL與PHP?或者可能只是在MySQL內部做到這一點?

謝謝!

+0

我想我甚至不需要刪除重複的條目。我只是想用最後一個副本的名字更新名字。 – 2011-03-14 05:00:23

回答

4

對於UPDATE查詢,我們需要得到的最小和最大的ID爲每個標籤,只有在有重複行:

UPDATE table t 
    JOIN (
    SELECT MinID, b.Name LatestName 
    FROM table b 
    JOIN (
     SELECT MIN(ID) MinID, MAX(ID) MaxID 
     FROM table 
     GROUP BY tag 
     HAVING COUNT(*) > 1 
    ) g ON b.ID = g.MaxID 
) rs ON t.ID = rs.MinID 
SET t.Name = LatestName; 

對於DELETE查詢,我們會刪除那些沒有頭都行它的標記組的ID:

DELETE t.* 
FROM table t 
    LEFT JOIN (
    SELECT MIN(ID) MinID 
    FROM table 
    GROUP BY tag 
) g ON t.ID = g.MinID 
WHERE g.MinID IS NULL; 
+0

美麗...我得到它的工作! – 2011-03-14 05:14:19