我有一个包含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 1
和4
(Apple iphone 6
)
我想在新闻表中保留最后一个ID行并删除其他旧行。
因此,在上面的示例中,我想要删除ID为1
的行,并保留具有相同标题列值的最后一个ID(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;
答案 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在关于引用被修改表的delete
和update
语句中非常挑剔。不幸的是,在ANSI SQL(和其他数据库)中执行此操作的典型方法并不常用:
delete from news
where id < (select max(id) from news n2 where n2.title = n.title);
你可以通过使用额外的子查询层来解决这个问题。