我们正在尝试创建一个ActiveRecord查询,为了理解,可以将其简化为博客示例。我们如何才能找到特定用户没有留下任何评论的所有博文?
我们当前的查询会返回帖子,只要某些评论不是特定用户,但如果该用户编写了任何评论,我们需要排除博客帖子。有什么想法吗?
答案 0 :(得分:4)
最合适的sql语法是“not exists”子句。外连接也很受欢迎,但这往往是出于历史原因,因为RDBMS查询优化器过去并不擅长为涉及许多记录的查询优化它们。
现在,一个体面的优化器可以使用一个不存在的查询来使用适当的东西,例如散列数据的散列反连接。
查询将是......
select *
from posts
where not exists (
select null
from comments
where comments.post_id = posts.id and
comments.user_id = 38)
在轨道说话......
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)
答案 1 :(得分:2)
Post.joins("LEFT JOIN comments ON posts.id = comments.post_id AND user_id = #{user_id}").where("comments.id IS NULL")