从A表中的数据中选择,在B表中没有匹配

时间:2015-11-21 21:28:36

标签: mysql sql database join

我有示例数据库,我存储男性和女性之间的关系。架构和一些数据显示在图像上。

enter image description here

有没有办法选择所有不属于BFF关系的男人? 例如,答案将是 Bob,Charlie和Nick

我认为,实际上我是从A表中选择数据而没有来自B表的数据(有一些条件)。有没有办法实现这个?

3 个答案:

答案 0 :(得分:2)

此类问题表明not exists。棘手的部分是not exists子查询有一个连接:

select m.*
from man m
where not exists (select 1
                  from man_women_relationship mwr join
                       type t
                       on mwr.fk_type = t.id
                  where mrw.fk_man = m.id and t.name = 'BFF'
                 );

答案 1 :(得分:1)

我是sql的新手,所以我可能错了。但这就是我想要的:

从Man_Women_Relationship连接中选择姓名输入Man_Women_Relationship.FK_Type = Type.ID AND Type.ID = 4

答案 2 :(得分:1)

子查询可能很慢而且难以阅读。您可以使用外部联接来避免使用子查询:

SELECT Man.*
FROM Man
JOIN Man_Woman_Relationship mwr ON Man.ID = mwr.FK_Man
LEFT JOIN Type ON mwr.FK_Type = Type.ID AND Type.Name = 'BFF'
WHERE Type.Name IS NULL

这将使你们所有处于关系中而不是处于BFF关系中的男人。为了包括不在任何关系中的男性,您还需要LEFT JOIN关系表:

SELECT Man.*
FROM Man
LEFT JOIN Man_Woman_Relationship mwr ON Man.ID = mwr.FK_Man
LEFT JOIN Type ON mwr.FK_Type = Type.ID AND Type.Name = 'BFF'
WHERE Type.Name IS NULL