对于脏数据,除了通过程序来修复,也可以通过mysql本身来修复。
问题一:查找指定组合字段的重复记录
SELECT * FROM tb_teacher a WHERE (a.user_id, a.create_time) IN ( SELECT user_id, create_time FROM tb_teacher WHERE type = 3 GROUP BY user_id, create_time HAVING count(*) > 3 ) AND a.id NOT IN ( SELECT min(id) FROM tb_teacher GROUP BY user_id, create_time HAVING count(*) > 1 );
点评:select的组合查询比较常规,可以通过表别名来识别子表。删除的就更为复杂。
问题二:删除指定组合字段的重复记录并仅保留一条最小ID记录
DELETE FROM tb_teacher WHERE (user_id, create_time) IN ( SELECT * FROM ( SELECT user_id, create_time FROM tb_teacher WHERE type = 3 GROUP BY user_id, create_time HAVING count(*) > 3 ) b ) AND id NOT IN ( SELECT * FROM ( SELECT min(id) FROM tb_teacher GROUP BY user_id, create_time HAVING count(*) > 1 ) c );
点评:相对select,delete 表现得更为苛刻,具体表现和解决方法如下:
1.使用mysql进行delete from操作时,若子查询的 FROM 字句和更新/删除对象使用同一张表,会出现错误。 mysql> DELETE FROM tab1 WHERE col1 = ( SELECT MAX( col1 ) FROM tab1 ); ERROR 1093 (HY000): You can’t specify target table ‘tab1′ for update in FROM clause 针对“同一张表”这个限制,撇开效率不谈,多数情况下都可以通过多加一层select 别名表来变通解决,像这样 DELETE FROM tab1 WHERE col1 = ( SELECT MAX( col1 ) FROM ( SELECT * FROM tab1 ) AS t ); ------------------------------------------------------------------------ 2. mysql delete from where in 时后面 的查询语句里不能加where条件 Sql代码 delete from `t_goods` where fi_id in (select * from ( select fi_id from `t_goods` where fs_num is null and fs_name is null and fs_type is null and fs_using is null and fs_lifetime is null) b) Sql代码 delete from `t_goods` where fi_id in (select fi_id from `t_goods` where fs_num is null and fs_name is null and fs_type is null and fs_using is null and fs_lifetime is null) Sql代码 delete from `t_goods` where fi_id in ( select fi_id from `t_goods` ) 上面三种情况,只有中间的不能执行。 综合起来就是mysql delete from where in 时后面 的查询语句里不能加where条件 --------------------------------------------------------------------------- 3. delete from table... 这其中table不能使用别名 Sql代码 delete from student a where a.id in (1,2);(执行失败) select a.* from student a where a.id in (1,2);(执行成功)参考:https://blog.csdn.net/tjcyjd/article/details/8950621