PHP菜鸟博客_共同学习分享PHP技术心得【PHP爱好者】
如何删除mysql表中字段值重复的记录id小的值只保留id最大的一条记录值
2022-8-18 菜鸟站长


mysql表:



 



SET NAMES utf8mb4;



SET FOREIGN_KEY_CHECKS = 0;



 



-- ----------------------------



-- Table structure for test



-- ----------------------------



DROP TABLE IF EXISTS `test`;



CREATE TABLE `test`  (



  `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,



  `order_sn` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,



  `order_sn_son` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,



  `clientkeynum` int(11) NULL DEFAULT NULL,



  `is_del` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,



  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,



  PRIMARY KEY (`id`) USING BTREE



) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;



 



-- ----------------------------



-- Records of test



-- ----------------------------



INSERT INTO `test` VALUES (1, '1001', '1', 1, '1', '哈哈');



INSERT INTO `test` VALUES (2, '1001', '1', 1, '1', '呵呵呵');



INSERT INTO `test` VALUES (3, '1002', '1', 1, '1', '嘿嘿');



INSERT INTO `test` VALUES (4, '1003', '2', 1, '1', '嘎嘎');



INSERT INTO `test` VALUES (5, '1003', '4', 1, '1', '狗狗');



INSERT INTO `test` VALUES (6, '1004', '5', 1, '1', '你好');



INSERT INTO `test` VALUES (7, '1004', '5', 1, '1', '我好');



INSERT INTO `test` VALUES (8, '1004', '5', 1, '1', '他好');



 



SET FOREIGN_KEY_CHECKS = 1;



 



 



 






上表中两个字段值order_sn以及order_sn_son同时重复的结果是1,2以及6,7,8,最终实现去掉1,6,7行。



 



 



select * from test where  clientkeynum='1' and  id not in(select max(id) as id from test group by order_sn,order_sn_son having count(order_sn)>0);



 



 



分析处理过程:根据order_sn,order_sn_son两列分组找到两个字段值重复大于0的最大id



select max(id) as id from test group by order_sn,order_sn_son having count(order_sn)>0;



得到的是2,3,4,5,8。这里大于0包含两个值相同只有一条记录的,以及两个值相同有多个记录的。取出来里面最大的id的话,包含有一条记录的以及多条记录里面最大的。这就是我们要保留的值。



上面例子是保留最后一条记录也就是最大值,也可以保留两个字段相同的最小记录。把max改成min。上面例子是两个字段同时重复,当然也可以只判断一个字段 group by里面只保留一个字段。

发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容