mysql怎么删除重复数据并且保留其中一条

24 篇文章 0 订阅

现在有张加班表,一个人同一天只允许申请一次加班,就是加班日期和userid相同的数据应该只有一条,但是现在由于之前没有做限制,导致很多数据重复

怎么通过sql删掉重复数据

思路:先查询重复数据的最大id(唯一一条),然后查询出所有重复数据,并且id不等于最大id的数据,然后删除即可

分解成几步,这样思路就相对清晰了

1.首先要知道怎么查询重复数据 就是SPONSOR_ID和datetime相同的数据

SELECT
		id 
	FROM
		t_yszg_grsq q 
	WHERE
		q.FORM_CODE = 303 
		AND q.FINISH_STATUS = 3 
		AND q.DELFLAG = 1 
	GROUP BY
		q.SPONSOR_ID,
		q.datetime 
	HAVING
		count(*) > 1 

先查询重复数据的id

在查询最大的id就简单了,稍微改下

SELECT
			max( ID ) AS maxid 
		FROM
			t_yszg_grsq q 
		WHERE
			q.FORM_CODE = 303 
			AND q.FINISH_STATUS = 3 
			AND q.DELFLAG = 1 
		GROUP BY
			q.SPONSOR_ID,
			q.datetime 
		HAVING
			count(*) > 1 

2.查询出重复的数据的SPONSOR_ID和datetime,

SELECT
	t.SPONSOR_ID,
	t.datetime 
FROM
	(
	SELECT
		q.SPONSOR_ID,
		q.datetime 
	FROM
		t_yszg_grsq q 
	WHERE
		q.FORM_CODE = 303 
		AND q.FINISH_STATUS = 3 
		AND q.DELFLAG = 1 
	GROUP BY
		q.SPONSOR_ID,
		q.datetime 
	HAVING
	count( 1 ) > 1 
	) AS t;

3.然后查询出SPONSOR_ID和datetime等于上面的数据,那么就可以查询出所有重复的数据,然后再删除不是最大id的数据

SELECT
	id 
FROM
	t_yszg_grsq 
WHERE
	( SPONSOR_ID, datetime ) IN (
	SELECT AT
		.SPONSOR_ID,
		AT.datetime 
	FROM
		(
		SELECT
			SPONSOR_ID,
			datetime 
		FROM
			t_yszg_grsq 
		WHERE
			FORM_CODE = 303 
			AND FINISH_STATUS = 3 
			AND DELFLAG = 1 
		GROUP BY
			SPONSOR_ID,
			datetime 
		HAVING
			count(*) > 1 
		) AT 
	) 

4.现在就简单了,只要删除在3中不在1中的数据即可,逻辑删除DELFLAG=0

SELECT
	id 
FROM
	t_yszg_grsq 
WHERE
	( SPONSOR_ID, datetime ) IN (
	SELECT AT
		.SPONSOR_ID,
		AT.datetime 
	FROM
		(
		SELECT
			SPONSOR_ID,
			datetime 
		FROM
			t_yszg_grsq 
		WHERE
			FORM_CODE = 303 
			AND FINISH_STATUS = 3 
			AND DELFLAG = 1 
		GROUP BY
			SPONSOR_ID,
			datetime 
		HAVING
			count(*) > 1 
		) AT 
	) 
	AND ID NOT IN (
	SELECT
		mt.maxid 
	FROM
		(
		SELECT
			max( ID ) AS maxid 
		FROM
			t_yszg_grsq q 
		WHERE
			q.FORM_CODE = 303 
			AND q.FINISH_STATUS = 3 
			AND q.DELFLAG = 1 
		GROUP BY
			q.SPONSOR_ID,
			q.datetime 
		HAVING
			count(*) > 1 
		) AS mt 
	);

sql看起来复杂,分解成几步,思路清晰,其实也很简单

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 可以使用以下 SQL 语句删除重复数据保留一条: ``` DELETE t1 FROM 表名 t1, 表名 t2 WHERE t1.id > t2.id AND t1.字段名 = t2.字段名; ``` 其中,`表名` 为需要删除重复数据的表名,`字段名` 为用于判断重复的字段名,`id` 为表中的主键或唯一标识符。该 SQL 语句会将所有重复数据保留一条删除其余重复数据。 ### 回答2: 要删除重复数据保留一条,可以使用MySQL的DELETE语句和子查询来实现。 首先,可以使用如下的SELECT语句来查询出所有重复数据: SELECT col1, col2, ..., coln, COUNT(*) AS count FROM table_name GROUP BY col1, col2, ..., coln HAVING COUNT(*) > 1; 这个查询用于找到所有有重复数据的列,并通过GROUP BY和HAVING子句筛选出重复数据。 接下来,可以使用DELETE语句和子查询来删除重复数据,只保留一条: DELETE FROM table_name WHERE (col1, col2, ..., coln) NOT IN (SELECT col1, col2, ..., coln FROM table_name GROUP BY col1, col2, ..., coln HAVING COUNT(*) > 1); 这个DELETE语句会删除表中除了第一次出现的重复数据以外的所有重复数据。 注意,在使用这个方法之前,一定要先备份好数据,以免误删数据。 ### 回答3: 要删除MySQL中的重复数据保留一条,可以使用以下的步骤: 1. 首先,我们需要找出重复数据。可以使用GROUP BY和HAVING语句来找到重复数据。例如,假设我们要删除表中的重复email字段,可以使用以下语句: SELECT email, COUNT(*) FROM table_name GROUP BY email HAVING COUNT(*) > 1; 这将返回所有重复的email及其重复的次数。 2. 根据找到的重复数据,我们可以选择保留其中的一条,并删除其他重复数据。可以使用DELETE语句来删除重复数据。例如,假设我们要保留COUNT(*)最大的那条数据,可以使用以下语句: DELETE FROM table_name WHERE email IN (SELECT email FROM table_name GROUP BY email HAVING COUNT(*) > 1) AND id NOT IN (SELECT MAX(id) FROM table_name GROUP BY email HAVING COUNT(*) > 1); 这将删除除了COUNT(*)最大的那条数据以外的其他重复数据。 3. 最后,我们可以再次运行第一步的查询语句来验证是否已成功删除重复数据。如果查询结果为空,说明已成功删除重复数据保留一条。 需要注意的是,执行此操作前请务必备份数据库,以防意外数据损失。另外,根据实际情况,可能需要针对具体的表和字段进行调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

红烧柯基

感谢您的支持!

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

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

打赏作者

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

抵扣说明:

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

余额充值