2017-01-03 59 views
1

當編寫一個數據庫轉換腳本,我所遇到的是有重複記錄的問題,我的目的是要找到這些和刪除重複。我絕不是SQL的專家,所以請尋求建議!選擇和刪除同一個表

我已經能夠想出這麼遠來查找和刪除重複記錄(如果組名和水平)是相同的是這

DELETE FROM achievements 
WHERE group_name IN (SELECT concat(group_name, level) 
        FROM achievements 
        GROUP BY group_name, level 
        HAVING count(*) >1); 

但它給我下面的錯誤的最好的事情

[ERR] 1093 - 表「的成就」被指定了兩次,既作爲「刪除」和作爲數據

這裏是一個單獨的源的目標我目前的數據; https://gist.github.com/Diddyy/13842901c830c19c21488613c9d27c92

從該數據有3個重複的(組名,接着電平);
ACH_CameraPhotoCount 5
ACH_FootballGoalScoredInRoom 1
ACH_FootballGoalScoredInRoom 2

餘類這些爲重複如已經存在具有相同名稱和層次的條目。

我的最終結果是,除去3次重複,但留下的每個所以它仍然存在之一。

請注意,允許複製組名稱。重複級別是允許的。但我不想要的是同一級別的group_name不止一次。

我似乎無法拿出一個解決方案,以及我不是太肯定CONCAT將是最好的方法是什麼?

對任何解決方案開放,謝謝!

+0

你能提供樣本數據和期望的結果? –

+0

@GordonLinoff補充信息,道歉! –

回答

1

刪除在MySQL重複正常的方法是使用join。下面移除了出現一次以上的所有group_name S:

delete a 
    from achievements a join 
     (select group_name, min(level) as minlevel 
      from achievements a 
      group by group_name 
      having count(*) > 1 
     ) aa 
     on a.group_name = aa.group_name; 

下所做的是比較常見的。它使一個 「複製」 行,說一個最低的水平:

delete a 
    from achievements a join 
     (select group_name, min(level) as minlevel 
      from achievements a 
      group by group_name 
      having count(*) > 1 
     ) aa 
     on a.group_name = aa.group_name 
    where a.level > aa.level; 

編輯:

你可以做同樣的事情group_namelevel

delete a 
    from achievements a join 
     (select group_name, level, min(id) as minid 
      from achievements a 
      group by group_name, level 
      having count(*) > 1 
     ) aa 
     on a.group_name = aa.group_name and a.level = aa.level 
    where a.id > aa.minid; 
+0

這似乎沒有我期望的最終結果,這是我的錯,因爲我沒有解釋我想要達到的準確程度。我想刪除group_name +級別已存在的重複項。我的數據中的一個例子是ACH_CameraPhotoCount - 5.這是重複的,因爲已經有一個group_name ACH_CameraPhotoCount的條目,其級別爲5.請參閱原始發佈以查看當前數據。抱歉! –

+0

非常感謝您的時間和解決方案,它已經實現了我所希望的! –