前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql常用功能之删除一张表中重复数据&ab表中a存在b不存在的 数据

mysql常用功能之删除一张表中重复数据&ab表中a存在b不存在的 数据

作者头像
凯哥Java
发布2019-06-28 10:56:16
3.9K0
发布2019-06-28 10:56:16
举报
文章被收录于专栏:凯哥Java凯哥Java凯哥Java

在开发中,我们有可能会遇到这种情况:

1:删除一张表中重复数据

2:AB两张表通过主键关联,删除A表中存在而B表中不存在的数据。如下图:

2cd4aad6c03a6309357b111115b33200.jpg
2cd4aad6c03a6309357b111115b33200.jpg

这样的怎么解决?

今天遇到一个问题。相同的数据在同一张表里出现了多次。我的需求是删除多余的数据,但要保留其中一条。 定义 表明 table_a ,判断唯一的两个字段 c_1,c_2,无关字段data 表中原始数据如下

a575ced5a8f562c15400ea24810e94dd.png
a575ced5a8f562c15400ea24810e94dd.png

首先我们要查看数据库中那些数据重复了,执行如下SQL

SELECT * FROM (SELECT COUNT(*) as num,c_1,c_2 FROM table_a GROUP BY c_1,c_2)e 
WHERE e.num>1;

结果如下 :

2c38070361c4fbb958af65b71746a77a.png
2c38070361c4fbb958af65b71746a77a.png

其中num字段为 数据出现的次数,可以发现我们已经找出了出现重复的数据,那么我们该怎么去除其中多余的数据呢。 我的思路是:再查询一个id 字段 ,我们group by 的时候 id 字段只能查询到重复数据中的一条。然后我们把这些id的数据删除,就达到了去重的效果。SQL 如下:

DELETE FROM table_a 
WHERE id IN (SELECT e.id FROM (SELECT id,COUNT(*) as num,c_1,c_2 FROM table_a GROUP BY c_1,c_2)e WHERE e.num>1);

突然想到一个更好的方法,SQL如下:

DELETE FROM table_a 
WHERE id IN (SELECT id FROM (SELECT id FROM table_a GROUP BY c_1,c_2 HAVING count(*) > 1)e);

执行:

fbbca4796727ada73ff171de0d69c7c0.png
fbbca4796727ada73ff171de0d69c7c0.png

可以看到有两行被删除了。这时再看看数据表,数据已经变成了:

20a71a757091ead690126c7f8032eac9.png
20a71a757091ead690126c7f8032eac9.png

成功将重复的数据删除。

如果重复数据是三条或者更多怎么办呢?很简单,再多执行几次这个SQL 就好了。

最后,别忘了给字段加个唯一索引,避免数据再出问题

89eb1df6305093922d284e6135264aa2.png
89eb1df6305093922d284e6135264aa2.png

问题2:

有表A 和表B. A是索引表,B是详细表(数据结构如下) A表 id title 1 标题 2 标题

B表 id listid info 1 1 内容1 2 1 内容2 3 1 内容3 4 2 内容1 5 2 内容2 6 2 内容3 7 3 内容1 8 3 内容2 9 3 内容3

现在A表已删除了某条记录

如何能将B表也删除A表没有的记录.

DELETE FROM B WHERE id IN (SELECT B.id FROM B LEFT JOIN A ON B.id=A.id WHERE A.id IS NULL);
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-08-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档