2013-02-13 183 views
2

特定的表我有兩個表:NOT IN使用MySQL

  1. 一個包含所有文章我的成員和

  2. 另一個持有的帖子ID和用戶ID隱藏後在他們的頁面上

我該如何選擇除隱藏表以外的所有帖子?

僞言例子...

「SELECT * FROM帖裏NOT IN(其它表)」

這是我迄今爲止

SELECT * FROM `acmPosting` LEFT JOIN `hidePosts` ON acmPosting.id = hidePosts.postID WHERE `sender`='$userID' OR `recip`='$userID' OR `sender` IN ($friendsArray) OR `recip` IN ($teamsArray) AND hp.id IS NULL ORDER BY `timeSent` DESC LIMIT 10 
+0

除了那些不是在隱藏表中的所有帖子......所以基本上,在所有帖子隱藏表? – 2013-02-13 06:31:04

+1

不應該是'SELECT * FROM posts WHERE ID NOT IN(other table)「'你忘了寫'ID' – asifsid88 2013-02-13 06:32:19

+0

你可以分享你的表結構嗎? – 2013-02-13 06:36:31

回答

2

這就是所謂的反連接,應使用NOT IN(雖然有不同的查詢計劃)是等價的:

SELECT * 
FROM posts p 
LEFT JOIN hiddenPosts hp on hp.id = p.id 
WHERE hp.id IS NULL 
; 

請參見本文的詳細信息:NOT IN vs. NOT EXISTS vs. LEFT JOIN/IS NULL

+0

這似乎是一個很棒的解決方案,但我似乎無法得到它的工作。這就是我有SELECT * FROM'acmPosting'左加入'hidePosts' ON acmPosting.id = hidePosts.postID WHERE'sender' ='$ userID'或'recip' ='$ userID'或'sender' IN($ friendsArray)或'recip' IN($ teamsArray)AND hp.id IS NULL ORDER BY'timeSent' DESC LIMIT 10 – 2013-02-13 07:11:03

+0

沒關係我在IS NULL字段中使用了一個快捷方式。 – 2013-02-13 07:18:39

5

假設第二個表是postHides,並且這兩個表都有一個postId列:

SELECT * FROM posts WHERE postId NOT IN (SELECT postId FROM postHides) 
2
SELECT post.* FROM post LEFT JOIN foo ON post.id = foo.post_id WHERE foo.post_id IS NULL 
2

假設其他表格分別命名爲hide_list外鍵posts.id其中fk_post_id。 然後select語句將是:

SELECT posts.* from posts,hide_list WHERE NOT posts.id=hide_list.fk_post_id; 

更優化的解決方案將是:

SELECT posts.* from posts,(SELECT fk_post_id from hide_list) hide_list WHERE NOT posts.id=hide_list.fk_post_id; 
2
"SELECT * FROM posts WHERE post_id NOT IN (select post_id from other_table)"