Mysql语句查找指定重复记录和删除重复记录仅保留一条【亲测可以】

对于脏数据,除了通过程序来修复,也可以通过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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FeelTouch Labs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值