如何根据mySQL中另一个表中的不匹配项从一个表中进行选择

如何根据mySQL中另一个表中的不匹配项从一个表中进行选择,mysql,Mysql,我有两张桌子 项目:id、名称 类别:项目\u id,类别 我需要选择ID不在CATEGORIES表中的所有项目 我怀疑它确实很简单,但无法理解语法 这将选择items表中的所有内容,并且仅选择与联接匹配的类别中的记录。然后过滤掉空值 Select Item.Id FROM ITEMS LEFT OUTER JOIN CATEGORIES On Items.Id = Categories.items_id where categories.items_id is null 这将选择items表

我有两张桌子

项目:id、名称

类别:项目\u id,类别

我需要选择ID不在CATEGORIES表中的所有项目


我怀疑它确实很简单,但无法理解语法

这将选择items表中的所有内容,并且仅选择与联接匹配的类别中的记录。然后过滤掉空值

Select Item.Id
FROM ITEMS LEFT OUTER JOIN CATEGORIES On
Items.Id = Categories.items_id
where categories.items_id is null

这将选择items表中的所有内容,并且仅选择与联接匹配的类别中的记录。然后过滤掉空值

Select Item.Id
FROM ITEMS LEFT OUTER JOIN CATEGORIES On
Items.Id = Categories.items_id
where categories.items_id is null
试试这个:

SELECT
    i.*
    FROM Items   i
        LEFT OUTER JOIN Categories  c ON i.id=c.items_id
        WHERE c.items_id is NULL
试试这个:

SELECT
    i.*
    FROM Items   i
        LEFT OUTER JOIN Categories  c ON i.id=c.items_id
        WHERE c.items_id is NULL
不在(选择类别。项目\u id)

不确定这是否比上面的连接快。。。但它可以工作。

不在(选择类别。项目id)

不确定这是否比上面的连接快。。。但它是有效的。

怎么样

SELECT id
, name
FROM ITEMS
WHERE NOT EXISTS(SELECT 1 FROM CATEGORIES WHERE Categories.items.id = ITEMS.id)
这将只带回在Categories表中至少没有一个条目的项目

SELECT id
, name
FROM ITEMS
WHERE NOT EXISTS(SELECT 1 FROM CATEGORIES WHERE Categories.items.id = ITEMS.id)
SELECT items.id
  FROM items
 WHERE NOT EXISTS( SELECT *
                     FROM categories
                    WHERE items.id = categories.items.id )
这将只带回在Categories表中至少没有一个条目的项目

SELECT items.id
  FROM items
 WHERE NOT EXISTS( SELECT *
                     FROM categories
                    WHERE items.id = categories.items.id )
这与加入Mike Pone和KM列出的categories表相同,但我发现这更具可读性

SELECT * FROM Items
WHERE id NOT IN (SELECT items_id FROM Categories)

这与加入Mike Pone和KM列出的categories表相同,但我觉得这更具可读性。

在categories表中是否真的有一个名为“items.id”的列?抱歉,编辑它以反映现实:)在categories表中是否真的有一个名为“items.id”的列?抱歉,编辑它以反映现实:)我也会这样做,而且简单得多。如果表演很重要。。。分析两个版本。也就是说,我第一次(可能也是唯一一次)使用NOT-IN,我更喜欢使用LEFT连接而不是NOT-IN,因为在过去,我一直被不使用索引的查询所困扰,而普通连接通常正确地使用索引。我对mysql不太熟悉,不知道哪个运行得更快,但如果两者都使用索引,它们的执行计划将完全相同。我也会这样做,而且会简单得多。如果性能很重要。。。分析两个版本。也就是说,我第一次(可能也是唯一一次)使用NOT-IN,我更喜欢使用LEFT连接而不是NOT-IN,因为在过去,我一直被不使用索引的查询所困扰,而普通连接通常正确地使用索引。我对mysql不太熟悉,不知道哪个运行得更快,但如果两者都使用索引,它们的执行计划将完全相同。mysql字段不区分大小写。但是代码非常松散,所以我同意您的downvote.MySQL字段不区分大小写。不过代码太草率了,所以我同意你的否决票。
SELECT * FROM Items
WHERE id NOT IN (SELECT items_id FROM Categories)