0

我有一张桌子user和一张桌子post。这是一个 N-1 关系,这意味着关系是通过 完成的post.user_id

我想找到没有名为“foobar”的帖子的用户。我试过这个:

SELECT `users`.* FROM `users` 
INNER JOIN `posts` ON `posts`.`user_id` = `users`.`id`
WHERE post.title !="foobar"

如果一个用户有一个名为 foobar 的帖子,它不会被退回,但只要有一个名为 foobar 的帖子,用户就会被退回。

在 sql 中我怎么说“我想要没有一个名为 foobar 的帖子的用户”。

4

3 回答 3

6

尝试 :

SELECT *
FROM `users` u
WHERE NOT EXISTS (
    SELECT 1 
    FROM `posts` 
    WHERE title = 'foobar'
    AND user_id = u.id
)
于 2013-02-26T16:38:02.900 回答
0

您可以离开加入标题为 foobar 的帖子,然后返回标题为空的所有行(不可能加入)。

SELECT `users`.* FROM `users` 
    LEFT JOIN `posts` ON `posts`.`user_id` = `users`.`id`
        AND posts.title = "foobar"
WHERE posts.title IS NULL
于 2013-02-26T16:39:03.240 回答
0

我对这些类型的查询的偏好是使用聚合和having

SELECT `users`.*
FROM `users` 
INNER JOIN `posts` ON `posts`.`user_id` = `users`.`id`
group by users.user_id
having sum(case when post.title = 'foobar' then 1 else 0 end) = 0
于 2013-02-26T16:43:28.517 回答