删除mySQL 5.7.9中的所有重复行

时间:2017-05-18 16:34:13

标签: mysql

我有这样的表

 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,现在在该表中我有一个重复的频道帖子,我尝试向表中添加unique key并删除所有重复的行这个查询

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

但在mysql 5.7.9我们不能这样做!

所以我想知道如何删除重复的行并添加channel的唯一键,post

解决方案

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

2 个答案:

答案 0 :(得分:4)

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    
)

答案 1 :(得分:3)

根据集合来考虑数据。

你想要通过频道发布的一组子记录,其中包含频道和帖子的最小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