PostgreSQL находит записи и сортирует их по левому внешнему соединению - PullRequest
1 голос
/ 09 февраля 2012

Я пытаюсь упорядочить извлеченные записи по полю в левом внешнем соединении в следующем запросе SQL:

@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)

Есть какие-нибудь подсказки, как успешно это сделать при сохранении эффективности?

1 Ответ

1 голос
/ 09 февраля 2012

Я думаю, что вы не должны использовать LEFT JOIN, или если код генерирует LEFT JOIN в этом случае, это, вероятно, неправильно.

Результат левого внешнего соединения (или просто левого соединения) для таблиц A и B всегда содержит все записи "левой" таблицы (A), "- http://en.wikipedia.org/wiki/Join_%28SQL%29#Left_outer_join

Таким образом, если вы не хотите иметь все записи от КОМПАНИЙ, , даже если нет совпадений по событиям , вам не следует использовать левое соединение здесь. Это приведет к появлению строк сЗначения NULL для правой таблицы.

...