MySQL检查2表中不相关的数据

时间:2018-08-12 23:39:06

标签: mysql

我有2个简单的表。

表_1

id | name
===========
1  | Fulan
2  | Abu
3  | Buya

table_2

id_1 | id_2
===========
1    | 2
1    | 3
2    | 1
2    | 3
3    | 1

在表_2中,数据2连接到3,但数据3未连接到2。

如何列出table_1,其中data 3(在table_2中)尚未与data 2连接?,因此我将获得名称“ Abu”

对不起,如果我的问题令人困惑,请先谢谢。

2 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,那么您希望表1中的所有名称都与表1中的所有其他名称不匹配(即表2中id_2的所有其他值都在表2中显示为id) )。您可以使用以下查询来做到这一点:

SELECT t1.id, t1.name
FROM table1 t1
WHERE (SELECT COUNT(*) FROM table2 t2 WHERE t2.id_2 = t1.id) != 
      (SELECT COUNT(*)-1 FROM table1)

输出:

id  name
2   Abu

修改

基于对问题的澄清,我已更改查询以列出所有未连接的人(其中连接被定义为table2.id_1 = person1和table2.id_2 = person2):

SELECT t1a.id, t1a.name, t1b.id, t1b.name
FROM table1 t1a
JOIN table1 t1b ON t1b.id != t1a.id
WHERE NOT EXISTS (SELECT * FROM table2 t2 WHERE t2.id_1 = t1a.id AND t2.id_2 = t1b.id)

输出:

id  name    id  name
3   Buya    2   Abu

答案 1 :(得分:0)

table_1的交叉自连接(完全外部)开始,将保留排列的完整列表。然后,table2上的左侧联接(其中table_2.id_2 is null的条件标准在table_2中查找与交叉联接不匹配的行。最终标准为t1.id!=t2.id,以消除自匹配情况。

select t1.id, t2.name from table_1 as t1
cross join table_1 as t2
left join table_2 on t1.id = id_1 and t2.id=id_2
where table_2.id_2 is null 
  and t1.id!=t2.id;