2

我有两张桌子:

  1. 一个持有我成员的所有帖子,并且

  2. 另一个持有帖子的 id,用户 id 将帖子隐藏在他们的页面上

我如何选择所有帖子,除了那些不在隐藏表中的帖子?

伪语句示例...

“SELECT * FROM posts WHERE 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
4

5 回答 5

5

假设第二个表是 postHides,并且两个表都有一个 postId 列:

SELECT * FROM posts WHERE postId NOT IN (SELECT postId FROM postHides)
于 2013-02-13T06:32:02.213 回答
2
SELECT post.* FROM post LEFT JOIN foo ON post.id = foo.post_id WHERE foo.post_id IS NULL
于 2013-02-13T06:33:29.863 回答
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

于 2013-02-13T06:33:30.483 回答
2

假设另一个表被命名hide_list并且其中的外posts.idfk_post_id然后选择语句将是:

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;
于 2013-02-13T06:39:09.447 回答
2
"SELECT * FROM posts WHERE post_id NOT IN (select post_id from other_table)"
于 2013-02-13T06:42:28.113 回答