mysql删除重复数据并保留一条


SELECT * FROM dept;

#分组介绍
#SELECT 重复字段 FROM 表 GROUP BY 重复字段 HAVING COUNT(*) > 1
SELECT 
	NAME, 
	COUNT(1)
FROM dept
GROUP BY `name`
HAVING COUNT(*) > 1

#查询全部重复的数据:
#SELECT * FROM 	表 WHERE 重复字段 IN ( SELECT 重复字段 FROM 表 GROUP BY 重复字段 HAVING 	COUNT(1) > 1 	)
SELECT *
FROM 	dept
WHERE `name` IN (
		SELECT NAME
		FROM dept
		GROUP BY `name`
		HAVING 	COUNT(1) > 1
	)

#将上面的查询select改为delete(会出错)
#[Err] 1093 - You can't specify target table 'dept' for update in FROM clause
#错误原因是:更新表的同时又查询了表,查询表的同时又更新了表。mysql不支持这种更新查询同一张表的操作
DELETE
FROM 	dept
WHERE `name` IN (
		SELECT NAME
		FROM dept
		GROUP BY `name`
		HAVING 	COUNT(1) > 1
	)

#解决:把要更新的几列数据查询出来作为一个第三方表,然后筛选更新。
#问题:会把重复的数据全部删除
DELETE FROM dept WHERE `name` IN(
SELECT `name` FROM (
SELECT name FROM dept GROUP BY name HAVING  COUNT(1) > 1 
) t
)

#查询表中多余重复的数据
#这种写法正确,但是查询的速度慢,可以试试方法二
SELECT * FROM dept WHERE `name` IN (
SELECT `name` FROM dept GROUP BY `name` HAVING count(1) > 1
) AND num NOT IN (
SELECT min(num) FROM dept GROUP BY `name` HAVING count(1) > 1
)

#方法二
SELECT * FROM dept WHERE num NOT IN (
SELECT d.minnum FROM (
SELECT MIN(num) AS minnum FROM dept GROUP BY `name`
) d
)

#还有方法三
SELECT * FROM dept AS d WHERE d.id <> (
SELECT MAX(e.id) FROM dept AS e WHERE d.name = e.name
)

#删除掉重复的多余数据只保留一条
DELETE FROM dept WHERE `name` IN (
  SELECT t.`name`  FROM (
    SELECT `name`  FROM  dept GROUP BY `name` HAVING count(1) > 1
   ) t
 )
AND num NOT IN (
SELECT dt.mindeptno FROM (
  SELECT  min(num) AS mindeptno  FROM  dept  GROUP BY `name` HAVING count(1) > 1
 ) dt
)

#第二种方法(与查询的第二种方法对应)
DELETE FROM dept WHERE num NOT IN (
  SELECT dt.minno  FROM (
    SELECT MIN(num) AS minno FROM dept  GROUP BY `name`
   ) dt
 )

#第三种方法(与查询的第三种方法对应)
DELETE  FROM  dept AS ta  WHERE ta.id <> (
	SELECT t.maxid  FROM ( 
		SELECT max( tb.id ) AS maxid FROM dept AS tb WHERE ta.`name` = tb.`name` ) t 
 )



#############
#多字段的操作#
#############

#group by的字段增加为需要的字段即可

DELETE FROM dept WHERE (`name`, `function`) IN (
  SELECT
   t.`name`,
   t.`function`
  FROM (
    SELECT
     `name`,
     `function`
    FROM dept 
		GROUP BY
     `name`,
     `function`
    HAVING  count(1) > 1
   ) t
 ) AND num NOT IN (
 SELECT  dt.mindeptno FROM (
   SELECT min(num) AS mindeptno
   FROM dept  GROUP BY
    `name`,
    `function`
   HAVING count(1) > 1
  ) dt
)

demo的表结构以及数据

/*
Navicat MySQL Data Transfer

Source Server         : 本机
Source Server Version : 80022

Target Server Type    : MYSQL
Target Server Version : 80022
File Encoding         : 65001

Date: 2020-12-13 21:32:44
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for dept
-- ----------------------------
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT '部门id',
  `num` int DEFAULT NULL COMMENT '部门编号',
  `name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '部门名称',
  `function` varchar(255) DEFAULT NULL COMMENT '职能',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8 COMMENT='部门表';

-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES ('2', '2', '人事部', '人事工作');
INSERT INTO `dept` VALUES ('3', '3', '行政管理部', '行政工作');
INSERT INTO `dept` VALUES ('5', '4', '财务部', '财务工作');
INSERT INTO `dept` VALUES ('6', '5', '市场部', '市场工作');
INSERT INTO `dept` VALUES ('7', '6', '销售部', '销售工作');
INSERT INTO `dept` VALUES ('23', '12', '技术部', '技术工作');
INSERT INTO `dept` VALUES ('27', '13', '技术部', '技术工作');
INSERT INTO `dept` VALUES ('28', '14', '技术部', '技术工作');

在公众号里看到的一篇文章借鉴学习一下

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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. 最后,我们可以再次运行第一步的查询语句来验证是否已成功删除重复数据。如果查询结果为空,说明已成功删除重复数据保留一条。 需要注意的是,执行此操作前请务必备份数据库,以防意外数据损失。另外,根据实际情况,可能需要针对具体的表和字段进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值