2013-02-13 184 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)"