今天在做一个小功能的时候,遇到了需要取两个表的差集,本来可以直接通过两次查表然后通过代码去处理。

由于我个人比较喜欢减少数据库交互,所以在网上查了下关于mysql两个表取差集的方案。但是发现很多的

差集的sql是有这两种方式:

第一种是通过not in的方式去处理:

select id from table_a where id not in (select id from table_b);

第二种则是通过左连接(left join)的方式:

select * from table_a as a

left join table_b as b

on a.id = b.id

where a.id is NULL;

本来我想着这样应该是可以的,后面我仔细思考了一下,发现这不像是差集,反而像是主表存在副表不存在的差集,

但是主表不存在副表存在的数据却没有过滤出来,即查出来的数据是主表独有,说明这不是完整的两个表差集的获取。

附上AB表交差并集等的图片(图片是网上找的)

faa00dbd857f

image.png

上面两种方法都是取的A在B表的差集,而我想要的是最下面右边的结果

那么该怎么办,我原本打算是直接用全连接(full join)来处理。

但是MySQL却没有提供全连接,所以要做差集处理需要做其他处理

但是从上图可以看出,取AB表的差集,就是拿A表独有数据跟B表独有数据合并

那么思路就有了,直接通过union将两个查询的结果合并即可。

select * from A left join B on A.id = B.id where B.id is nullunion select * from A right join B on A.id = B.id where A.id is null;

这种方式其实也可以弄成两个sql查询,通过代码去处理。

但是我个人比较倾向于减少数据库的交互,所以采用这种方式。

当然,如果有更好的方法就更好了。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐