0

我有以下查询可以提取属于博客的帖子

SELECT p.* 
FROM  `Posts` p
INNER JOIN Blogs b ON b.id = p.blog_id

是否有与“ON”相反的 MySQL 函数?如果我想在“博客”数据库表中查询不属于博客的帖子?例如,如果博客被删除。

4

2 回答 2

4

您需要使用任一LEFT JOIN - NULL组合,如下所示:

         SELECT p.*
           FROM Posts p
LEFT OUTER JOIN Blogs b
             ON b.id = p.blog_id
          WHERE b.id IS NULL

...或NOT IN从属查询(使用所谓的“反连接”):

       SELECT * 
         FROM Posts 
        WHERE blog_id NOT IN (SELECT id FROM Blogs)

我承认我几乎只使用第一种形式,但实际上它们具有相似的性能:我建议至少浏览一下这篇文章,详细解释这些查询之间的异同;这是一本很有启发性的读物。)

于 2012-10-18T23:15:36.923 回答
2

这都是关于 JOIN 的。

SELECT p.* 
FROM  `Posts` p
LEFT OUTER JOIN Blogs b ON b.id = p.blog_id

WHERE b.Id IS NULL

应该为您解决问题。

Jeff Atwood对连接有很好的概述

在这种情况下,LEFT OUTER JOIN 所做的是将 Blogs 中的所有行与具有相同 blog_id-Id 组合的 Posts 中的所有行以及在 Blogs 中没有匹配 Id 的 Posts 中的所有行匹配。在这种情况下,对于博客中的条目,这些行是 NULL(因为没有任何!),这就是我们过滤的原因b.Id IS NULL

还有其他一些方法可以实现这一点;例如:

SELECT * FROM Posts WHERE blog_id NOT IN (SELECT Id FROM Blogs)

实际上,这会查询文章中所有具有不在博客表中的 blog_id 的行。

于 2012-10-18T23:15:55.833 回答