外部联接查找没有匹配关联条目的记录

pio*_*trb 4 mysql join

我正在尝试查找foo没有任何bar符合给定条件的记录的所有记录。

create table foo (
  id integer
);

create table bar (
  foo_id integer,
  name varchar(255)
);

insert into foo (id) values (1),(2),(3),(4),(5),(6);
insert into bar (foo_id, name) values
 (1,"name1"),
 (2,"name1"),
 (3,"asd"),
 (4,"name2"),
 (5,"name2"),
 (3,"name1");
Run Code Online (Sandbox Code Playgroud)

基于此 .. 只有记录6符合条件,因为它没有标记为name1name2

select
  foo.*
from foo
  left outer join bar on (foo.id = bar.foo_id)
where
  bar.name not in ("name1","name2") or bar.name is null;
Run Code Online (Sandbox Code Playgroud)

我缺少什么?

ype*_*eᵀᴹ 5

如果你想坚持使用left join,应该是这样的。您要排除的条件已放置在left join .. on零件上,并保留where .. is null检查:

select
    foo.*
from 
    foo
  left outer join bar 
    on  foo.id = bar.foo_id
    and bar.name in ('name1', 'name2')
where 
    bar.name is null ;
Run Code Online (Sandbox Code Playgroud)

也可以通过以下方式完成not exists

select
    foo.*
from 
    foo
where 
    not exists
      ( select *
        from bar 
        where foo.id = bar.foo_id
          and bar.name in ('name1', 'name2')
      ) ;
Run Code Online (Sandbox Code Playgroud)