我有一个表User
和表Post
。用户可以有很多帖子。这是架构:
User
user_id
user_name
Post
post_id
post_content
user_id
我想要一个查询:获取没有任何帖子的所有用户。我可以用原始sql做到这一点,但我不知道我们是否有任何方法可以使用ActiveRecord。如果存在,请告诉我如何。
我可以根据Marek Lipka的回答来做到这一点:
User.includes(:posts).where(posts: { post_id: nil })
现在我不明白的是,由explain生成的查询与在控制台上打印的查询不同。
这是在控制台上打印的查询:
SELECT COUNT(DISTINCT "users"."id") FROM "users" LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id" WHERE "posts"."id" IS NULL
这是解释上的查询打印。它更复杂,因为查询不会选择所有内容,而是逐个字段地选择。
EXPLAIN for: SELECT "users"."id" AS t0_r0, "users"."email_address" AS t0_r1, "users"."first_name" AS t0_r2, "users"."last_name" AS t0_r3, "users"."full_name" AS t0_r4, "users"."avatar_url" AS t0_r5, "users"."profile_name" AS t0_r6, "users"."profile_base_name" AS t0_r7, "users"."profile_base_name_order" AS t0_r8, "users"."quote" AS t0_r9, "users"."user_register_phrase" AS t0_r10, "users"."total_followers" AS t0_r11, "users"."total_followings" AS t0_r12, "users"."token" AS t0_r13, "users"."jwt_token" AS t0_r14, "users"."active_state" AS t0_r15, "users"."role_id" AS t0_r16, "users"."created_at" AS t0_r17, "users"."updated_at" AS t0_r18, "posts"."id" AS t1_r0, "posts"."user_id" AS t1_r1, "posts"."post_type" AS t1_r2, "posts"."book_id" AS t1_r3, "posts"."title" AS t1_r4, "posts"."content" AS t1_r5, "posts"."total_upvotes" AS t1_r6, "posts"."total_downvotes" AS t1_r7, "posts"."total_views" AS t1_r8, "posts"."total_subscriptions" AS t1_r9, "posts"."accent_search" AS t1_r10, "posts"."created_at" AS t1_r11, "posts"."updated_at" AS t1_r12 FROM "users" LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id" WHERE "posts"."id" IS NULL
由于
答案 0 :(得分:2)
有一种方法可以执行具有特定条件的左外连接:
User.includes(:posts).where(posts: { post_id: nil })