5

我们正在尝试创建一个 ActiveRecord 查询,为了便于理解,该查询可以简化为博客示例。我们如何找到没有特定用户留下任何评论的所有博客文章?

只要某些评论不是由特定用户撰写,我们当前的查询就会返回帖子,但如果任何评论是由该用户撰写的,我们需要排除博客帖子。有任何想法吗?

4

2 回答 2

6

最合适的 sql 语法是“不存在”子句。外连接也很流行,但这往往是出于历史原因,因为 RDBMS 查询优化器过去并不擅长针对涉及许多记录的查询进行优化。

如今,一个体面的优化器可以使用诸如散列反连接之类的适合批量数据的方法来实现不存在的查询。

查询将是...

select *
from   posts
where  not exists (
         select null
         from   comments
         where  comments.post_id = posts.id and
                comments.user_id = 38)

在rails-speak ...

Post.where("not exists (select null from comments where comments.post_id = posts.id and comments.user_id = #{user.id}")

更新:

Rails 中更好的语法:

Post.where.not(Comment.where("comments.post_id = posts.id").where(:user_id => user.id)).exists)
于 2013-07-06T17:08:23.207 回答
2
Post.joins("LEFT JOIN comments ON posts.id = comments.post_id AND user_id = #{user_id}").where("comments.id IS NULL")
于 2013-07-06T01:23:54.793 回答