MySQL处理冗余信息(仅有主键不一致)

本文介绍了一种使用SQL实现的数据清理方法,通过删除重复记录,确保表中每类水果只保留一条记录,且对应于最小的主键id。具体实现涉及分组、子查询和DELETE语句的巧妙组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录一个比较有趣的题目,以下建表语句:
CREATE TABLEtest(idint(11) NOT NULL,peopleIdint(11) DEFAULT NULL,namevarchar(255) DEFAULT NULL, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
表中数据大致如此,满足字段类型属性即可
id peopleid name
1 101 苹果
2 101 苹果
3 202 香蕉
4 303 鸭梨
5 303 鸭梨
6 303 鸭梨
要求处理上面的表(删除操作实现),得到表中每类水果只有一条记录,同一个人对应的记录值主键id 要是最小的;以下是自己的一种实现思路,
DELETE FROM test WHERE id NOT in( SELECT * FROM( SELECT MIN(id) FROM test GROUP BY peopleId)as temp_tab);
自己的想法是先选择出peopleid最小的记录,且水果名字/peopleid不会重复(使用分组实现),此时查出来的结果不能直接作为条件使用(SELECT MIN(id) FROM test GROUP BY peopleId);此时查询能够得到符合条件的保留数据,但是因为其中id为主键,不能直接在条件中使用,所以要再次查询;最后在执行删除。
自增字段的处理一也是一样的;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值