2012-02-09 2 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 

Но извлеченный записи не сортируются должным образом, как ожидалось (например, event.created_at)

Любой ключ к тому, как успешно это сделать, сохраняя при этом эффективность?

+0

Что точно вы имеете в виду «* не отсортировано правильно *»? Каким будет «правильный» порядок сортировки? –

+0

записи не сортируются по 'events.created_at DESC' в соответствии с инструкциями. – cnicolaou

+2

Я уверен, что 'ORDER BY' корректно работает в Postgres. Пожалуйста, покажите нам пример вывода того, что вы считаете неправильным. Знаете ли вы, что 'events.created_at' может содержать NULL-значения из-за внешнего соединения? –

ответ

1

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

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

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

+0

Спасибо. Я смотрю на него – cnicolaou

Смежные вопросы