【问题标题】: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
      

      根据您的要求更改您的属性。

      【讨论】:

        猜你喜欢
        • 2013-06-23
        • 2015-12-21
        • 1970-01-01
        • 2023-02-10
        • 2010-10-29
        • 2010-09-29
        • 2011-03-15
        • 1970-01-01
        相关资源
        最近更新 更多