使用mysql中的not exist查找尚未分配的ID

使用mysql中的not exist查找尚未分配的ID,mysql,Mysql,我有一个locnew表,其中包含仓库中所有位置的名称,因此: 1 | acb1 2 | acb7 3 | aba2 我还有一个location表,它将产品分配到各个位置,因此它将有一个新的locid(location\u description\u id),然后是产品的所有详细信息。我编写此查询是为了显示每个位置中的所有项目: select l.* , ln.location_description from location l join locnew ln o

我有一个
locnew
表,其中包含仓库中所有位置的名称,因此:

1 | acb1
2 | acb7
3 | aba2
我还有一个
location
表,它将产品分配到各个位置,因此它将有一个新的locid(
location\u description\u id
),然后是产品的所有详细信息。我编写此查询是为了显示每个位置中的所有项目:

select l.*
     , ln.location_description 
  from location l
  join locnew ln 
    on ln.id = l.location_description_id
 where l.location_description_id != 376
这给了我他们所有的库存


有没有办法使用not exists来扭转这种情况,以便我可以在位置表中找到所有未分配任何产品的“locnew”id的列表?

您可以使用左联接

select l.*, ln.location_description 
    from location l
    left join locnew ln 
    on ln.id = l.location_description_id
    where ln.id is null
联接在数学中被概念化为集合运算

当您加入时,您将取两个集合的交点

左联接时,将取两个集合与左(第一个表)集合的其余成员的交集

右连接时,将取两个集合与右(第二个表)集合的其余成员的交集


然而,正如您所看到的,这三个选项都不能满足您的需要。您需要的是左侧集合中的还押项目。这就是为什么在where子句中添加ln.id为null的原因。当右侧没有记录时,ln.is变为null,查询将提供您所需的信息。

此查询将提供您所需的结果:

SELECT * FROM locnew ln
WHERE NOT EXISTS(SELECT 1 FROM location
                 WHERE location_description_id = l.id)

您可以解释一下内部联接和左联接之间的区别,以及为什么这对OP需求有用