我有一个Log
模型,其中包含以下列:
["id", "username", "event", "parameters", "extras", "created_at", "updated_at"]
现在,我想获取username
订购的每个created_at
的第一个日志。
执行此操作的一种方法是为每个用户名运行以下查询:
log = Log.where("username = :username", username: username).order(:created_at).first
但这很明显会查询数据库很多次(等于用户名的数量)。有没有办法只做一个数据库查询?
答案 0 :(得分:3)
DISTINCT ON
的另一种情况:
SELECT DISTINCT ON (username) *
FROM log
ORDER BY username, created_at;
为您提供"第一个"的整行。每username
条目。
详细说明:
Select first row in each GROUP BY group?
Ruby / AR / Postgres的相似答案:
Display latest messages from messages table, group by user
如何执行原始SQL:
Table join sql to rails active record query
我不是Ruby专家,但这种Ruby语法应该有效:
Log.select("DISTINCT ON (username) *").order(:username, :created_at)
答案 1 :(得分:0)
Log.select("DISTINCT username").order(:created_at)
答案 2 :(得分:0)
我认为group by
子句可以解决问题。
Log.group(:username).order(:created_at)
这将为您提供如下查询:
SELECT `logs`.* from `logs` GROUP BY username ORDER BY `logs`.`created_at` ASC
将返回每个username
的第一条记录。