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

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

时间:2023-03-25 15:07:25浏览次数:51  
标签:删除 grsq 重复 datetime SPONSOR mysql id ID SELECT


现在有张加班表,一个人同一天只允许申请一次加班,就是加班日期和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看起来复杂,分解成几步,思路清晰,其实也很简单

标签:删除,grsq,重复,datetime,SPONSOR,mysql,id,ID,SELECT
From: https://blog.51cto.com/u_15964543/6149479

相关文章

  • windows下安装mysql8方法
    系统环境及软件版本:windows11,MySQL8.0.32。windows下安装mysql有两种方法,一个下载mysql的exe可执行文件安装,比较适合小白,下载后双击执行安装包,下一步、下一步就可以。第二......
  • C# 操作 MySql
    C#操作MySql简介代码介绍代码实现创建数据库创建数据表查询数据事务代码示例简介工作中大多数情况下用的都是MySql但一直没有记录,相关操作。这篇文章以便MySql.Data库......
  • 若依框架 --- 菜单已分配,无法删除解决
    **在项目中删除某个菜单时,提示存在子菜单(菜单已分配),不允许删除,如下:**![](https://img-blog.csdnimg.cn/20201023115950263.png#pic_center)查了一下源码:publicAjaxResult......
  • EF6链接MySql报The underlying provider failed on open错误
    这个问题困惑了好久,在自己电脑是数据库连接都可以用(VS2017),但是在公司的电脑(VS2015)上死活报:Theunderlyingproviderfailedonopen这个错误。网上查找了很多资料都没有得......
  • 代码随想录Day9-Leetcode28. 实现 strStr(),459.重复的子字符串
    28.实现strStr()这题之前写过,而且印象深刻的是细节很多,所以这边是看完以前的代码,再写的(几乎是在背代码了hhh)甚至这样,next[0]=-1,和j开始匹配子串是没初始化成......
  • 什么是Mysql和Mysql原理、Mysql主从复制、SQL语句
    ✍什么是MysqlMysql是关系数据库管理系统,一般中小型网站的开发都选择MySQL作为网站数据库搭配PHP和Apache可组成良好的开发环境.✍关系型数据库和非关系数据库1、关系数......
  • MySQl学习(从入门到精通11)
    https://blog.csdn.net/qq_42055933/article/details/128935615?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~AD_ESQUERY~ylj......
  • linux (CentOS7.5_x86_64)下安装mysql8.0
    #下载mysql$wgethttp://mirrors.163.com/mysql/Downloads/MySQL-8.0/mysql-8.0.13-el7-x86_64.tar.gz#解压$mysqltar-zxvfmysql-8.0.4-rc-linux-glibc2.12-x86_6......
  • install mysql in docker for testing
    installmysqlindockerfortesting#step-1:configuremysql_port='3306'mysql_password='123qwe'mysql_data_dir="~/docker/mysqld_${mysql_port}/data"#step-2:......
  • run mysql server in docker with exist database
    step1:putyourdatabasein$mysql_data_dirfirststep2:putyourmy.confto$mysql_cnf,forexample:thatmy.cnffromalibabacloud[mysqld]pid-file=......