我有一张表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”。
答案 0 :(得分:6)
尝试:
SELECT *
FROM `users` u
WHERE NOT EXISTS (
SELECT 1
FROM `posts`
WHERE title = 'foobar'
AND user_id = u.id
)
答案 1 :(得分:0)
你可以在标题为foobar的帖子上保持联接,然后返回标题为null的所有行(没有可能的连接)。
SELECT `users`.* FROM `users`
LEFT JOIN `posts` ON `posts`.`user_id` = `users`.`id`
AND posts.title = "foobar"
WHERE posts.title IS NULL
答案 2 :(得分: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