我有一个名为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中实现这一点,那就火了。
答案 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的情况下做你想做的事情。该页面的“分组”部分中有一个示例,与您尝试的内容类似。