Sql Rails-检索不同的记录

Sql Rails-检索不同的记录,sql,ruby-on-rails,ruby-on-rails-3,postgresql,distinct,Sql,Ruby On Rails,Ruby On Rails 3,Postgresql,Distinct,我有以下几点属于我的关系: class Trophy < ActiveRecord::Base has_many :awards end class Award < ActiveRecord::Base belongs_to :trophy end 但是,这不是很有效,因为我要处理很多记录 目前,我正在这样做: def recent_awards trophy_awards = awards.limit(50).recent.includes(:user) tro

我有以下几点属于我的关系:

class Trophy < ActiveRecord::Base
  has_many :awards
end

class Award < ActiveRecord::Base
  belongs_to :trophy
end
但是,这不是很有效,因为我要处理很多记录

目前,我正在这样做:

def recent_awards
  trophy_awards = awards.limit(50).recent.includes(:user)
  trophy_awards.uniq! {|a| a.user_id}
  trophy_awards[0...4]
end
问题是,如果最后48个奖项是给同一个用户的,它不会给我5个不同的用户奖项

返回5个最新但不同的用户奖项的最佳方式是什么

试试这个:

Award.find_by_sql("SELECT *
  FROM awards a1 INNER JOIN (
    SELECT MAX(created_at) AS recent
    FROM awards
    GROUP BY user_id) a2
  ON (a1.created_at = a2.recent)
  ORDER BY a1.created_at DESC
  LIMIT 5;")

哦,老兄,这是一个很棒的SQL问题,我将不得不掸掉我大脑中有一段时间没用过的部分…OP已经尝试过了,说它从数据库中获取了太多的记录。OP只想从查询本身获取五条记录。可能很迂腐,但我认为可能
奖励。包括(:user)。最近的.uniq.limit(5)
读起来更好一些…这不会基于奖励表中的用户id返回唯一的奖励记录…基于“对于奖杯的一个实例,我想返回5个最新但不同的用户奖励”,我没有意识到这是一个要求。使用
where
将其限制为特定的用户很容易,但如果您可以像
user.trophy.limit(5).recent.includes(:user)那样构造它可能会更好.uniq.awards
,或其他什么…关于您的关系没有足够的细节可以猜测,但它应该很容易更改。无论哪种方式,
.uniq
都将检索不同的记录。这给了我postgres语法错误…应该说我正在使用postgres@keruilin,我编辑了答案。此版本已为我的项目工作修改ed帮我检查一下,如果我需要做任何其他更改,请告诉我。好吧,它不应该抛出错误,但实际上我不确定它是否会为您提供最新的更改:(
def recent_awards
  awards.limit(5).recent.includes(:user).uniq
end
Award.find_by_sql("SELECT *
  FROM awards a1 INNER JOIN (
    SELECT MAX(created_at) AS recent
    FROM awards
    GROUP BY user_id) a2
  ON (a1.created_at = a2.recent)
  ORDER BY a1.created_at DESC
  LIMIT 5;")