Ich habe eine Tabelle User
und Tabelle Post
. Ein Benutzer kann viele Beiträge haben. Hier ist das Schema:ActiveRecord: Abfrage aller Datensätze, die keine Verknüpfungsdaten
User
user_id
user_name
Post
post_id
post_content
user_id
Ich möchte eine Abfrage haben, dass: Ruft alle Benutzer ohne Post. Ich kann das mit Raw Sql tun, aber ich weiß nicht, ob wir irgendwelche Möglichkeiten für ActiveRecord haben oder nicht. Wenn vorhanden, bitte sag mir wie.
Ich kann dies tun, basierend auf Marek Lipka Antwort:
User.includes(:posts).where(posts: { post_id: nil })
Das Ding jetzt, dass ich nicht verstehe, ist, dass die Abfrage erzeugt durch erklären aus Abfrage unterscheidet, die auf der Konsole ausgibt.
Hier Abfrage, die auf der Konsole ausgibt:
SELECT COUNT(DISTINCT "users"."id") FROM "users" LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id" WHERE "posts"."id" IS NULL
Hier Abfrage Druck auf erklären. Es ist komplizierter, weil die Abfrage nicht alle auswählt, sondern Feld für Feld auswählt.
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
Dank
Vielen Dank. Es klappt. Das einzige, was ich jetzt nicht verstehe, ist Abfrage ist auf Konsole gedruckt ist anders mit Abfrage, wenn erklären. Kannst du mir erklären wieso? (Ich habe zusätzliche Informationen zur Frage gepostet, bitte schauen Sie) –