关于MYSQL两个表取差集

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

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

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

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

select mailbox_id from co_user where mailbox_id not in (select mailbox_id from core_mailbox);

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

select cu.mailbox_id,cm.mailbox_id from co_user as cu 
    left join core_mailbox as cm 
      on cu.mailbox_id = cm.mailbox_id 
        where cm.mailbox_id is NULL;

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

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

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

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

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

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

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

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

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

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

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

当然,如果有更好的方法就更好了。第一次写博文,希望给点好的建议,谢谢!

 

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值