ActiveRecord / MySQL查询返回分组的对象集

时间:2010-10-18 12:23:41

标签: mysql ruby-on-rails ruby activerecord

我有一个名为Statement的模型属于Member。给定一组成员,我想创建一个查询,为每个成员返回最新语句(最好是在一个很好的干净查询中)。

我认为我可以使用grouporder实现此目标 - 例如:

# @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 个答案:

答案 0 :(得分:2)

在MySQL中,您需要一个子查询,它返回每个成员的最大created_at值,然后可以将其连接回Statement表以检索行的其余部分。 / p>

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

答案 1 :(得分:0)

如果您使用的是Rails 3,我建议您查看新的ActiveRecord查询语法。 http://guides.rubyonrails.org/active_record_querying.html

有一个概述

我很确定你可以在不写任何SQL的情况下做你想做的事情。该页面的“分组”部分中有一个示例,与您尝试的内容类似。