2013-04-09 53 views
0

我有兩個表格來表示帖子及其類別。
下面是一個簡單的表模式: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 

我不會沒有美食的帖子gories。

有沒有比做子查詢更好的方法?

回答

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 
+0

我試過了,可以運行 – 2013-04-09 09:20:36

+0

謝謝,我可以幫忙 – Argeman 2013-04-09 10:18:07

1

關於什麼:

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

我不知道爲什麼你需要在你的子查詢「帖子」。所有你想要的是從'post_categories'獲得類別爲!= 5的帖子,然後從'帖子'獲得他們的信息。

+0

好的......是啊顯然我做了一個不必要的關係在該子查詢中,我沒有看到。但我的意思是,如果我可以用另一種方法而不是用子查詢來完成。 – 2013-04-09 09:16:06

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 

應該努力!

+0

這只是發現所有帖子 – Argeman 2013-04-09 09:17:33

+0

你確定嗎? – 2013-04-09 09:19:15

+0

不是絕對的,但我相信它會給你所有職位與_any_類別以外的5。這不是什麼問。 – Argeman 2013-04-09 09:21:52

相關問題