如何删除mysql表中字段值重复的记录id小的值只保留id最大的一条记录值
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里面只保留一个字段。
版权声明:若无特殊注明,本文皆为《菜鸟站长》原创,转载请保留文章出处。
本文链接:如何删除mysql表中字段值重复的记录id小的值只保留id最大的一条记录值 - https://wlphp.com/?post=367