2012-02-09 15 views
1

私は左の外側にフィールドで取得したレコードを注文しようとしているが、次のSQLクエリに参加する外部結合左:PostgreSQLのレコードを検索し、並べ替え

@companies = Company.scoped 
@companies = @companies.where("companies.is_deleted = 'f' AND companies.state IN (?)", ["draft", "pending"]) 
@companies = @companies.includes(:events) 
@companies = @companies.order("events.created_at DESC") 

SELECT "companies"."id" AS t0_r0, "companies"."name" AS t0_r1, "companies"."reference" AS t0_r2, "companies"."state" AS t0_r3, "companies"."description" AS t0_r4, "companies"."remarks" AS t0_r5 "events"."id" AS t2_r0, "events"."eventable_type" AS t2_r1, "events"."eventable_id" AS t2_r2, "events"."event_type" AS t2_r3, "events"."creator_company_id" AS t2_r4, "events"."creator_user_id" AS t2_r5, "events"."created_at" AS t2_r6 
FROM "companies" 
LEFT OUTER JOIN "events" ON "events"."eventable_id" = "companies"."id" AND "events"."eventable_type" = 'company' 
WHERE "companies"."is_deleted" = 'f' AND companies.state IN ('draft','pending') 
ORDER BY events.created_at DESC 

しかし、検索レコードが正常にソートされていない(つまりevents.created_atによって)

パフォーマンスを維持しながら正常に処理するにはどのような手掛かりがありますか?

+0

「*正しくソートされていない*」という意味ですか?「適切な」ソート順は何ですか? –

+0

レコードは指示通りに 'events.created_at DESC'によってソートされません。 – cnicolaou

+2

私は、 'ORDER BY'がPostgresで正しく動作することを確信しています。あなたが正しいと思われるものの出力例を示してください。 'events.created_at'には外部結合のためにNULL値が含まれている可能性がありますか? –

答えて

1

LEFT JOINを使用するべきではない、またはこの場合LEFT JOINを生成するコードが間違っていると思います。

左外の結果は、(参加または単に左)結合テーブルAとBのため、常に「、 "左" のテーブル(A)のすべてのレコードを含む - http://en.wikipedia.org/wiki/Join_%28SQL%29#Left_outer_join

したがって、イベントに一致するものがない場合でも、COMPANIESのすべてのレコードを持っていない場合は、はここで左結合を使用するべきではありません。右側のテーブルのNULL値を持つ行が得られます。

+0

ありがとうございます。私はそれを見ている – cnicolaou

関連する問題