今天在做一個(gè)小功能的時(shí)候,遇到了需要取兩個(gè)表的差集喜最,本來可以直接通過兩次查表然后通過代碼去處理戈鲁。
由于我個(gè)人比較喜歡減少數(shù)據(jù)庫(kù)交互,所以在網(wǎng)上查了下關(guān)于mysql兩個(gè)表取差集的方案咧纠。但是發(fā)現(xiàn)很多的
差集的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;
本來我想著這樣應(yīng)該是可以的,后面我仔細(xì)思考了一下泻骤,發(fā)現(xiàn)這不像是差集漆羔,反而像是主表存在副表不存在的差集梧奢,
但是主表不存在副表存在的數(shù)據(jù)卻沒有過濾出來,即查出來的數(shù)據(jù)是主表獨(dú)有演痒,說明這不是完整的兩個(gè)表差集的獲取亲轨。
附上AB表交差并集等的圖片(圖片是網(wǎng)上找的)
上面兩種方法都是取的A在B表的差集,而我想要的是最下面右邊的結(jié)果
那么該怎么辦鸟顺,我原本打算是直接用全連接(full join)來處理惦蚊。
但是MySQL卻沒有提供全連接,所以要做差集處理需要做其他處理
但是從上圖可以看出讯嫂,取AB表的差集蹦锋,就是拿A表獨(dú)有數(shù)據(jù)跟B表獨(dú)有數(shù)據(jù)合并
那么思路就有了,直接通過union將兩個(gè)查詢的結(jié)果合并即可欧芽。
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;
這種方式其實(shí)也可以弄成兩個(gè)sql查詢莉掂,通過代碼去處理。
但是我個(gè)人比較傾向于減少數(shù)據(jù)庫(kù)的交互渐裸,所以采用這種方式巫湘。
當(dāng)然,如果有更好的方法就更好了昏鹃。