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

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

时间:2023-02-13 17:02:14浏览次数:49  
标签:删除 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/6054513

相关文章

  • kafka删除topic清空数据
    一般情况下,是不会删除数据的。到达一定时间后,kafka会自动删除。如果一定要删除可以删除topic在重建topic了No.1:如果需要被删除topic此时正在被程序produce和consum......
  • 数据库导出excel信息(mysql数据库已经验证)
    导出表信息1SELECT2TABLE_NAME表名,3REPLACE(4REPLACE(TABLE_COMMENT,CHAR(10),''),5CHAR(13),6','7......
  • 从List 删除元素开始说起
    前言写错过List删除元素的方法,看到过正确方法,老是记错,还是写篇文章记录一下,mark. 先看一段代码:classTestArrayListIterator{publicstaticvoidmain(String[......
  • 【LeetCode字符串#06】KMP巩固练习:重复子串
    重复的子字符串力扣题目链接(opensnewwindow)给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。......
  • LeetCode-83. 删除排序链表中的重复元素(java)
    一、前言:......
  • mysql中判断一个字段是否为纯数字
    今天线上,某些数据的行政区划展示成数字了,应该是这个字段存了中文的名字而不是行政区划代码需求:查出表中某个字段不是纯数字,因为行政区划代码是纯数字,哪怕有一个汉字......
  • docker搭建mysql主从复制
    docker搭建mysql主从复制​​1、主从复制搭建步骤​​​​1.1新建主服务器容器实例3307​​​​1.2新建my.cnf​​​​1.3重启master实例​​​​1.4进入mysql-master容......
  • docker安装mysql:5.7(利用数据卷挂载方式启动)
    docker安装mysql:5.7​​1、DockerHub上面查找mysql镜像​​​​2、拉取镜像​​​​3、新建mysql容器实例​​​​4、新建my.cnf文件​​​​5、重新启动mysql容器实例再......
  • 运维工程师监控工作之Mysql数据库监控
    目前互联网公司、金融公司信创建设最常用的数据库是Mysql,由于外部流量压力往往最终落到数据库层面,因此对Mysql数据库的监控几乎是运维工程师的看家本领。数据库监控通常分......
  • 92、商城业务---购物车---防止添加购物车数据重复提交
    当我们添加购物车成功时,会跳转到如下页面当我们刷新这个页面时,会不断给后台发请求,就导致不断添加该商品致使该商品数量增多。解决办法:将添加成功与页面跳转分开以前我......