mysql删除重复数据

目标:删除数据表中bookname和authorID同时重复的多余数据,只保留其中的任意一条数据
给出一个数据库例子
在这里插入图片描述

思路:
删除之前,先select查看需要删除的数据是否为目标数据

1、首先找到表中重复的目标数据

利用group by方法同时对两列进行分组查找
having后面使用count()对指定列中数据出现次数进行比较

SELECT *
FROM book
GROUP BY bookname,authorID 
HAVING COUNT(*)>1;

在这里插入图片描述
显示结果并不符合预期,查找原因:
可能由于显示问题该结果整合了数据,只显示一条

用concat()函数检查一下:

SELECT bookname,authorID,GROUP_CONCAT(bookID)
FROM book
GROUP BY bookname,authorID 
HAVING COUNT(*)>1;

得出:
在这里插入图片描述
所以结果为显示问题而非方法错误

2、如果按照1选出的数据删除则所有重复数据都删除而不会保留唯一一条数据

由于取出的数据是多条的,但是id是不重复的
可以利用min()或者max()方法仅取出一个id,并按照id保留数据

SELECT MIN(bookID)
	FROM book
	GROUP BY bookname,authorID
	HAVING COUNT(*)>1;

在这里插入图片描述
可以看到取出了一个id

3、将1,2中的数据组合成需要删除的数据

需要删除的数据是在1中且不在2中的数据
使用in()和not in()方法进行筛选

SELECT *FROM book
WHERE (bookname,authorID) IN (
	SELECT bookname,authorID
	FROM book
	GROUP BY bookname,authorID
	HAVING COUNT(*)>1)
	AND bookID NOT IN(
	SELECT MIN(bookID)
	FROM book
	GROUP BY bookname,authorID
	HAVING COUNT(*)>1)

得出结果,符合需要删除的要求
在这里插入图片描述

4、删除符合要求的结果数据
DELETE FROM book
WHERE (bookname,authorID) IN (
	SELECT bookname,authorID
	FROM book
	GROUP BY bookname,authorID
	HAVING COUNT(*)>1)
	AND bookID NOT IN(
	SELECT MIN(bookID)
	FROM book
	GROUP BY bookname,authorID
	HAVING COUNT(*)>1)
报错
查询:delete from book WHERE (bookname,authorID) IN ( SELECT bookname,authorID FROM book GROUP BY bookname,authorID HAVING COUNT(*)>1)...错误代码: 1093
You can't specify target table 'book' for update in FROM clause

查找原因:
错误代码为1093,查找后得知mysql对子查询的支持是比较薄弱的

解决办法:
将查到的数据取别名,多加一个嵌套

取别名

SELECT bookID FROM (
SELECT *FROM book
WHERE (bookname,authorID) IN (
	SELECT bookname,authorID
	FROM book
	GROUP BY bookname,authorID
	HAVING COUNT(*)>1)
	AND bookID NOT IN(
	SELECT MIN(bookID)
	FROM book
	GROUP BY bookname,authorID
	HAVING COUNT(*)>1)
	)  AS t

嵌套完成删除操作:

DELETE FROM book WHERE bookID IN (
SELECT bookID FROM (
SELECT *FROM book
WHERE (bookname,authorID) IN (
	SELECT bookname,authorID
	FROM book
	GROUP BY bookname,authorID
	HAVING COUNT(*)>1)
	AND bookID NOT IN(
	SELECT MIN(bookID)
	FROM book
	GROUP BY bookname,authorID
	HAVING COUNT(*)>1)
	)  AS t)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值