我有两张表代表帖子及其类别的表格 这是一个简化的表格模式:
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
我不会收到那些没有类别的帖子。
有没有比做子查询更好的方法?
答案 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