Mysql Rails 3正在扰乱数据库查询中的顺序

Mysql Rails 3正在扰乱数据库查询中的顺序,mysql,ruby-on-rails-3,activerecord,Mysql,Ruby On Rails 3,Activerecord,我正在使用will_paginate gem和rails 3.2.3。 我正在尝试显示所有具有最新帖子排序的特定标签的帖子,因此我使用以下方法: @posts = Post.find_by_post_type_label(session[:current_post_type],@selected_labels) .paginate(:page => params[:page], :order => "comments.created_at DESC").

我正在使用will_paginate gem和rails 3.2.3。 我正在尝试显示所有具有最新帖子排序的特定标签的帖子,因此我使用以下方法:

  @posts = Post.find_by_post_type_label(session[:current_post_type],@selected_labels)
             .paginate(:page => params[:page], :order => "comments.created_at DESC").all
但它返回的帖子是无序的。每个页面都将被排序,但第二个页面将包含应该在第一个页面上的帖子

例如:

Post.find_by_post_type_label(1,[])
返回帖子[1,2,3,4,5,6,7,8,9,10],每个帖子的最新评论都是几个月前的。它生成的sql是:

 SELECT `posts`.* FROM `posts` WHERE `post`.`post_type_id` = 1

如果我下订单,并限制它,比如:

Post.find_by_post_type_label(1,[]).order(comments.created_at DESC).limit(5)
will_paginate就是这样做的,它返回帖子2,3,4,5,7

生成后:

SELECT DISTINCT `post`.id FROM `posts` LEFT OUTER JOIN
`comments` ON `comments`.`post_id` = `post`.`id` WHERE 
`post`.`post_type_id` = 1 ORDER BY posts.created_at DESC LIMIT 5

在订购之前,它显然是有限制的,但我不知道如何改变它。 任何帮助都将不胜感激

编辑1

这些关系是这样的:

Class Post
  belongs_to :user
  belongs_to :post_type
  has_many :comments, dependent: :destroy, order: 'created_at DESC'
  has_and_belongs_to_many :labels

Class Comment
  belongs_to :post
  belongs_to :user

注释是数据库中唯一具有时间戳的注释。第一个注释保存了POST的创建时间。

您应该考虑方法

因此,您可以像这样重新编写查询:

ts = Post.find_by_sql("SELECT * FROM posts WHERE post_type_id = ? and id in (?) ORDER BY created_at DESC LIMIT 5", session[:current_post_type], @selected_labels).paginate(:page => params[:page]).all

我不确定@选择标签是什么,这也是Pr.CytDeTyAt而不是评论,我不知道为什么你会想通过评论来分类帖子……你想先看看最活跃的帖子吗?< /P> < P>你应该考虑方法

因此,您可以像这样重新编写查询:

ts = Post.find_by_sql("SELECT * FROM posts WHERE post_type_id = ? and id in (?) ORDER BY created_at DESC LIMIT 5", session[:current_post_type], @selected_labels).paginate(:page => params[:page]).all

我不知道@selected_标签是什么,也不知道它是按Post.created_at排序的,而不是按评论排序的,我不知道你为什么要按评论排序帖子……你想先查看最活跃的帖子吗?

在find_by_sql中使用此sql结束

SELECT  p1.*, iv.created_at FROM posts p1
INNER JOIN ( SELECT p2.id id, max(c.created_at) created_at FROM posts p2
            INNER JOIN comments c ON c.post_id = p2.id
            GROUP BY p2.id)
iv ON p1.id=iv.id ORDER BY iv.created_at DESC LIMIT 5

在find_by_sql中使用此sql

SELECT  p1.*, iv.created_at FROM posts p1
INNER JOIN ( SELECT p2.id id, max(c.created_at) created_at FROM posts p2
            INNER JOIN comments c ON c.post_id = p2.id
            GROUP BY p2.id)
iv ON p1.id=iv.id ORDER BY iv.created_at DESC LIMIT 5

所选标签由“按类型查找”标签用于筛选帖子。在我的例子中它是空白的。我想先显示带有最新评论的帖子。按post属性排序并没有给我带来问题,它只是在我尝试使用嵌套属性时出现的?属性,在所选标签被“按类型查找”标签用于筛选帖子后,排序开始出现。在我的例子中它是空白的。我想先显示带有最新评论的帖子。按post属性排序并没有给我带来问题,它只是在我尝试使用嵌套属性时出现的?在限制之后开始排序的属性