0

我有关注查询

  notes = Note.where('notes.id IN
  (
    SELECT "notes"."id" FROM "notes" 
      WHERE "notes"."circle_id" = ?
  )
  OR notes.id IN 
  (
    SELECT "notes"."id" FROM "notes" 
      INNER JOIN "circles_dreams" 
      ON "circles_dreams"."dream_id" = "notes"."dream_id" 
      WHERE "circles_dreams"."circle_id" = ? 
  )', @circle.id, @circle.id)

如何简化此查询?谢谢。

4

2 回答 2

0

首先,您可以收集所有需要的笔记 id。Note我应该认为你已经和之间有什么关系CirclesDream

note_ids = Note.where(circle_id: @circle.id).pluck(:id) # your first SELECT
dream_ids = CirclesDream.where(id: @circle.id).pluck(:note_id) # your second SELECT

notes_ids = note_ids | dreams_ids # combine them

notes = Note.where(id: notes_ids) # Now your

upd:我刚刚修正了错字。在第二个请求中更改idnote_id

于 2012-11-03T08:02:34.420 回答
0

试试这个

note_ids = Note.where('circle_id = ?', @circle.id).pluck(:id)

dream_note_ids = Note.joins(:circle_dreams).where('circle_dreams.circle_id = ?', @circle.id).plunk(:note_id)

notes_ids = note_ids | dream_note_ids

如果您的circle_dreams表可以包含具有 的记录note_id = null,那么您必须应用联接。所以我认为这将适用于你的情况....

于 2012-11-03T09:32:45.947 回答