我正在尝试获取仅对某些用户可见的帖子ID列表。我目前的说法是:

SELECT `p`.`id`
FROM   `posts` AS `p`
       INNER JOIN `post_visibilities` AS `pv`
               ON `pv`.`post_id` = `p`.`id`
WHERE  `pv`.`user_id` IN ( 1, 2, 3, 4 );


这在某种程度上是可行的,但是IN()子句的行为有点像子集,并且我返回的帖子可以被这四个用户和其他用户看到。我需要找到仅对这四个用户可见的帖子。

最佳答案

您可以直接翻译它,并使用不存在的形式。
尽管我不得不说不存在(因此子查询)总是有点慢。
不知道是否有任何更快的方法。

SELECT DISTINCT `p`.`id`
FROM   `posts` AS `p`
       INNER JOIN `post_visibilities` AS `pv`
               ON `pv`.`post_id` = `p`.`id`
WHERE  `pv`.`user_id` IN ( 1, 2, 3, 4 )
       and not exists (select 1 from `post_visibilities` as 'excluder'
         where excluder.post_id = p.id and excluder.user_id not in (1,2,3,4));

关于mysql - 将联接限制为完整集而不是子集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33782572/

10-11 07:59