【问题标题】:How to get the most recent record from a LEFT OUTER JOIN in Rails 3如何从 Rails 3 中的 LEFT OUTER JOIN 获取最新记录
【发布时间】:2014-06-10 23:25:11
【问题描述】:
我有两个模型:
用户和帖子(用户有很多帖子)
我需要获取一个用户列表,按最近发布的帖子(包括列表顶部有 NONE 帖子的用户)排序。
到目前为止,我设法做到了这样的事情:
@users = User
.joins("LEFT OUTER JOIN posts ON users.id = posts.user_id")
.group("users.id")
.order("posts.created_at ASC")
.page(params[:page])
这就是把没有任何帖子的那些放在顶部,但其余的没有被排序。我怎样才能做到这一点?
【问题讨论】:
标签:
mysql
ruby-on-rails-3
activerecord
left-join
【解决方案1】:
我没有找到使用普通 activerecord 完成此任务的方法。我的解决方案是:
@users = User.find_by_sql(%q{
SELECT users.*
FROM users
LEFT OUTER JOIN (
SELECT user_id, MAX(created_at) as max_created_at
FROM posts
GROUP BY user_id
) AS posts_sq
ON posts_sq.user_id = users.id
LEFT OUTER JOIN posts AS posts
ON posts.user_id = posts_sq.user_id
AND posts.created_at = posts_sq.max_created_at
WHERE deleted = false
ORDER BY posts.id IS NULL DESC, posts.created_at DESC
}).paginate(:page => params[:page])
【解决方案2】:
试试这个,
SELECT tc.id, tc.name, tc.order,
th.id as history_id, th.finished_at, th.score
FROM trainings tc
LEFT OUTER JOIN (SELECT id, training_id, MAX(finished_at) as finished_at, score
FROM training_histories GROUP BY training_id) th ON th.training_id = tc.id
WHERE tc.id > 4
AND tc.id < 8
GROUP BY tc.id
ORDER BY tc.order_by ASC, tc.id ASC
根据您的要求更改您的属性。