我有模型消息(id,text,sender_id,recipient_id,created_at)。 我只需要获取每个recipient_id范围内的最后记录。这就像大多数Messangers页面中的所有对话一样。
例如,我有这个(收件人是current_user):
id, sender_id, created_at
1, 1, 10.04.15
2, 1, 11.04.15
3, 2, 12.04.15
4, 3, 13.04.15
5, 2, 14.04.15
使用查询我只需要获取ID为2,4,5的值,按以下方式分组:
id, sender_id, created_at
2, 1, 11.04.15
4, 3, 13.04.15
5, 2, 14.04.15
通过此选择,我们拥有按用户分组的所有记录:
Message.order(created_at: :desc).group_by(:sender_id)
答案 0 :(得分:3)
您可以在每个步骤中细分以下内容以查看输出结果:
latest_ids = Message.group(:recipient_id).maximum(:id).values
使用获取的ID,您可能想要获取记录:
Message.where(id: latest_ids)
两个查询,是的,但这比替代方案更清晰,可能涉及自己编写一些SQL。
答案 1 :(得分:1)
您可以使用以下选择查询通过PostgreSQL获取所需的内容
SELECT id
,created_at
,recipient_id
FROM (
SELECT id
,created_at
,recipient_id
,row_number() OVER (
PARTITION BY recipient_id ORDER BY created_at DESC
) rn
FROM dt
) t
WHERE rn = 1
ORDER BY id