ActiveRecord / MySQL запрос на возврат сгруппированного набора объектов - PullRequest
1 голос
/ 18 октября 2010

У меня есть модель под названием Statement, которая принадлежит Member. Учитывая массив членов, я хочу создать запрос, который будет возвращать самый последний оператор для каждого из этих членов (предпочтительно в одном хорошем чистом запросе).

Я думал, что смогу добиться этого, используя group и order - что-то вроде:

# @members is already in an array

@statements = Statement.all(
  :conditions => ["member_id IN(?)", @members.collect{|m| m.id}],
  :group      => :member_id,
  :order      => "created_at DESC"
)

Но, к сожалению, приведенное выше всегда возвращает самый старый оператор для каждого члена. Я попытался поменять местами опцию заказа, но, увы, она всегда возвращает самое старое утверждение группы, а не самое последнее.

Полагаю, group_by не способ достичь этого - так как мне этого добиться?

PS - все, кто не читает Ruby / Rails, читают это, если вы знаете, как добиться этого в необработанном MySQL, а затем выстрелите.

Ответы [ 2 ]

2 голосов
/ 18 октября 2010

В MySQL напрямую необходим подзапрос, который возвращает максимальное значение created_at для каждого члена, который затем может быть присоединен к таблице Statement для извлечения остальной части строки.

SELECT *
FROM Statement s
    JOIN (SELECT 
              member_id, MAX(created_at) max_created_at 
          FROM Statement 
          GROUP BY member_id
    ) latest
        ON  s.member_id  = latest.member_id 
        AND s.created_at = latest.max_created_at
0 голосов
/ 18 октября 2010

Если вы используете Rails 3, я бы рекомендовал взглянуть на новый синтаксис запросов ActiveRecord.Обзор http://guides.rubyonrails.org/active_record_querying.html

Я вполне уверен, что вы могли бы сделать то, что вы пытаетесь сделать, без написания SQL.В разделе «Группировка» на этой странице есть пример, похожий на то, что вы пытаетесь сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...