样表:
CREATE TABLE `test` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT '',
`create_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
插入数据
INSERT INTO `test` (`name`) VALUES ('aa');
INSERT INTO `test` (`name`) VALUES ('bb');
INSERT INTO `test` (`name`) VALUES ('bb');
INSERT INTO `test` (`name`) VALUES ('cc');
INSERT INTO `test` (`name`) VALUES ('cc');
INSERT INTO `test` (`name`) VALUES ('cc');
假如要按 name 字段分组后有重复的记录保留最大id的数据
实现思路:
- 创建临时表,存放要删除的id
- 将分组后最小的id找出来,存在临时表
- 联表删除
- 重复第2、3步,直到影响行数为0
实现方法:
创建临时表
CREATE TABLE `delid` (
`id` int(10) unsigned NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
执行删除:
#查询最小id
INSERT into delid select min(id) from test GROUP BY name HAVING count(*) >1;
#关联删除
DELETE FROM test where id in(select id from delid);
#清空临时表
truncate table delid;
发表评论 取消回复