如果一个连接记录不匹配,则删除所有连接结果

时间:2014-11-20 21:44:30

标签: mysql sql join

我有两张桌子。

A    
ID   NAME
--------------
1    A


B
USER_ID  role
--------------
1         ADMIN
1         USER
1         ROLE2

如果我使用A LEFT JOIN B where role!='admin'我得到2个结果。 但是,如果我不希望用户1的结果,因为一个用户的记录不匹配会怎样?

3 个答案:

答案 0 :(得分:1)

您可以使用NOT EXISTS:

的查询
SELECT A.*, B.*
FROM
  A INNER JOIN B
  ON A.ID = B.USER_ID
WHERE
  NOT EXISTS (SELECT * FROM B AS b2 WHERE b2.USER_ID = A.ID AND b2.ROLE = 'ADMIN')

答案 1 :(得分:1)

问题其实不清楚。根据我从数据中理解的内容,

如果用户ID(在他的情况下为'1')是管理员,则他不想返回任何用户ID为“1”的记录。所以让我们稍微扩展这个表。

A    
ID   NAME
--------------
1    A


B
USER_ID  role
--------------
1         ADMIN
1         USER
1         ROLE2
2         NOTADMIN
2         ROLE3

您可以使用以下查询过滤掉您不想要的记录。

select X.id, Y.id, Y.Role from table_A as Y
Left Join 
( select B.id, B.Role from table_B as B join ( select id from table_B where Role = 'admin' ) as A on A.id != B.id ) as X 
on (x.id = Y.id)

然后你只得到:

2 NOTADMIN

2 ROLE3

希望这会有所帮助..

答案 2 :(得分:0)

看起来你想要一个子查询。

 Select * from A 
        where ID not in (select USER_ID from B where role = 'ADMIN')

如果只想要B中有角色的结果,可以添加内部联接:

 Select * from A
       Inner join B on A.ID = B.User_ID
       where A.ID not in (select B2.USER_ID from B B2 where B2.role = 'ADMIN')

将结果限制为表B中具有匹配项的结果和没有ADMIN角色的结果。