2017-05-18 89 views
0

我有這樣刪除MySQL中的所有重複的行5.7.9

select id,channel,post from posts limit 10 
+------+------------+-------+ 
| id | channel | post | 
+------+------------+-------+ 
| 1433 | channel2 | 19353 | 
| 1434 | channel2 | 19353 | 
| 1435 | channel2 | 19354 | 
| 1436 | channel2 | 19354 | 
| 1437 | channel2 | 19356 | 
| 1438 | channel2 | 19357 | 
| 1439 | channel2 | 19358 | 
| 1440 | channel2 | 19359 | 
| 1441 | channel2 | 19360 | 
| 1634 | channel2 | 19360 | 
+------+------------+-------+ 
該表 id

表是primary key,現在在該表中,我有一個重複的職位的頻道,我嘗試添加​​表並刪除所有重複的行與此查詢

ALTER ignore TABLE `posts` ADD UNIQUE key `unique_index` (`channel`, `post`); 

mysql 5.7.9我們不能做到這一點!

,所以我想知道我怎樣才能刪除重複行並添加獨特的密鑰channelpost


溶液中以套計算

DELETE FROM posts 
WHERE ID Not in (SELECT* 
       FROM (SELECT MIN(ID) 
         FROM posts 
         GROUP BY channel, Post) B 
       ) 
+0

我假設你想保留與最小的id記錄? –

+0

@RaymondNijland:真的,現在並不重要,所以沒有什麼不同! – MrUnknow

回答

1

xQbert回答doenst工作,因爲你不能在一個刪除使用相同的表子查詢。 所以你需要使用額外的表格來解決這個問題。

DELETE FROM 
posts 
WHERE 
posts.id NOT IN ( 
    SELECT 
    id 
    FROM ( 
    SELECT 
     MIN(id) AS id 
    FROM 
     posts 
    GROUP BY 
     posts.channel 
    , posts.post 
) 
    AS 
    posts_id  
) 
2

認爲數據的。

您希望通過頻道發佈記錄的子集以及頻道和帖子的最小ID(要保留的記錄)然後,您要從所有帖子中的ID不在子集中的帖子中刪除(記錄保留)您創建。

DELETE FROM posts 
WHERE ID Not in (SELECT* 
       FROM (SELECT MIN(ID) 
         FROM posts 
         GROUP BY channel, Post) B 
       ) 

因此,你保留所有的頻道/職位與他們的最小(ID)。你可以使用max(ID)或者我們可以獲得更多的發球友;但你沒有特別的偏好......

SQL Fiddle

+0

錯誤代碼:1093.你不能指定目標表.... – MrUnknow

+0

但是我這樣做:'刪除從帖子WHERE id在(選擇minid從(選擇min(id)作爲minid從帖子GROUP BY通道,後HAVING COUNT(*)> 1)x)'這是工作! – MrUnknow

+2

只是在它周圍嵌套一個子查詢。 – xQbert