0

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

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

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

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

4

3 回答 3

2

你做一个左联接:

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

应该管用!

于 2013-04-09T09:15:52.670 回答
1

关于什么:

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

我不确定您为什么在子查询中需要“帖子”。你想要的只是从'post_categories'中获取类别!= 5的帖子,然后从'posts'中获取他们的信息。

于 2013-04-09T09:14:53.417 回答
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
于 2013-04-09T09:16:05.683 回答