从列中重复的表中删除最旧的行?

时间:2014-08-27 10:50:14

标签: mysql sql duplicates delete-row

我有一个包含48列的表news

该表有一些像这样的值:

ID|title            |date      |.......
 1|Apple iphone 6   |2014-08-23
 2|Samsung Galaxy s5|2014-08-23
 3|LG G3            |2014-08-25
 4|Apple iphone 6   |2014-08-25
 5|HTC One m8       |2014-08-27

“标题”值在ID 14Apple iphone 6

中重复

我想在新闻表中保留最后一个ID行并删除其他旧行。 因此,在上面的示例中,我想要删除ID为1的行,并保留具有相同标题列值的最后一个ID(4)。

4 个答案:

答案 0 :(得分:3)

delete from news
where id not in
(
  select * from 
  (
     select max(id) 
     from news
     group by title
  ) tmp
)

此查询按标题分组,并为每个唯一标题选择最新的id。然后它删除所有不具有id的记录。

我添加了另一个子查询,因为在MySQL中,您无法同时从正在删除的表中进行选择。

答案 1 :(得分:1)

这是最明确的方法:

DELETE n FROM news n INNER JOIN  news nn ON  n.title = nn.title AND n.id < nn.id;

http://sqlfiddle.com/#!2/02255f/2

答案 2 :(得分:1)

棘手,因为很容易删除非重复

1找到重复项 2确定最老的id 3只删除那些!

delete from news where id in (
   select min(id) from news 
   group by title
   having title in (
      select title from news group by title having count(title) > 1
   )
)

答案 3 :(得分:0)

在MySQL中,我会使用join

来完成此操作
delete n
   from news n join
        (select title, max(id) as keepid
         from news
         group by title
        ) ti
        on ti.title = n.title and ti.id < keepid;

MySQL在关于引用被修改表的deleteupdate语句中非常挑剔。不幸的是,在ANSI SQL(和其他数据库)中执行此操作的典型方法并不常用:

delete from news
    where id < (select max(id) from news n2 where n2.title = n.title);

你可以通过使用额外的子查询层来解决这个问题。