我有以下查询可以提取属于博客的帖子
SELECT p.*
FROM `Posts` p
INNER JOIN Blogs b ON b.id = p.blog_id
是否有与“ON”相反的 MySQL 函数?如果我想在“博客”数据库表中查询不属于博客的帖子?例如,如果博客被删除。
您需要使用任一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)
我承认我几乎只使用第一种形式,但实际上它们具有相似的性能:我建议至少浏览一下这篇文章,详细解释这些查询之间的异同;这是一本很有启发性的读物。)
这都是关于 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 的行。