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)

レールで言えば...

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 に答える