美文网首页
mysql 查询两张表的差集

mysql 查询两张表的差集

作者: keyuan0214 | 来源:发表于2020-10-15 15:58 被阅读0次

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

    由于我个人比较喜欢减少数据库交互,所以在网上查了下关于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表交差并集等的图片(图片是网上找的)

    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查询,通过代码去处理。

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

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

    相关文章

      网友评论

          本文标题:mysql 查询两张表的差集

          本文链接:https://www.haomeiwen.com/subject/gkkopktx.html