获取每个组的第一条记录列表
我有一个包含以下列的Log
模型:
["id", "username", "event", "parameters", "extras", "created_at", "updated_at"]
现在,我想获取created_at
命令的每个username
的第一个日志。
一种方法是为每个用户名运行以下查询:
log = Log.where("username = :username", username: username).order(:created_at).first
但这显然会多次查询数据库(等于用户名的数量)。 有没有办法只做一个数据库查询?
DISTINCT ON
另一个案例:
SELECT DISTINCT ON (username) * FROM log ORDER BY username, created_at;
为每个username
“第一”条目的整行 。
细节:
选择每个GROUP BY组中的第一行?
类似的答案Ruby / AR / Postgres:
从用户分组显示消息表中的最新消息
如何执行原始SQL:
表连接sql到rails活动记录查询
我不是Ruby专家,但这个Ruby语法应该有效:
Log.select("DISTINCT ON (username) *").order(:username, :created_at)
Log.select("DISTINCT username").order(:created_at)
我认为group by
子句可以解决这个问题。
Log.group(:username).order(:created_at)
这将为您提供如下查询:
SELECT `logs`.* from `logs` GROUP BY username ORDER BY `logs`.`created_at` ASC
这将返回每个username
第一条记录。