MYSQL:获取不属于某个类别的项目

时间:2013-04-09 09:12:16

标签: mysql

我有两张表代表帖子及其类别的表格 这是一个简化的表格模式:

posts                post_categories
-----               ----------------
-id                 -post_id
-title              -cat_id
-text

我需要获取不属于类别“5”的所有帖子

SELECT * FROM `posts` WHERE id NOT IN( SELECT id FROM `posts`, 
`post_categories` AS cat WHERE cat.cat_id=5 AND posts.id=cat.post_id ) 

我正在使用子查询,因为帖子可以不属于任何类别,所以如果我做的很简单:

cat_id!=5 AND posts.id=post_id

我不会收到那些没有类别的帖子。

有没有比做子查询更好的方法?

3 个答案:

答案 0 :(得分:2)

你进行LEFT JOIN:

SELECT DISTINCT `field1`,`field2`...etc FROM `posts` a LEFT JOIN `post_categories` b ON a.id=b.post_id  WHERE b.cat_id <> 5

应该工作!

答案 1 :(得分:1)

怎么样:

SELECT * FROM `posts` WHERE id NOT IN( SELECT id FROM
`post_categories` WHERE cat_id!=5) 

我不确定你为什么需要&#39;帖子&#39;在您的子查询中。你想要的只是来自&quot; post_categories&#39;有类别!= 5的帖子,然后从&#39;帖子中获取他们的信息。

答案 2 :(得分:1)

在性能方面,做左连接通常“更好”。这样做:

SELECT * FROM `posts` 
    LEFT JOIN `post_categories` AS cat ON posts.id=cat.post_id AND cat.cat_id=5
WHERE  cat.cat_id IS NULL