Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 查询按关联表列排序的结果,仅限最近的关联_Ruby On Rails_Sorting_Mysql - Fatal编程技术网

Ruby on rails 查询按关联表列排序的结果,仅限最近的关联

Ruby on rails 查询按关联表列排序的结果,仅限最近的关联,ruby-on-rails,sorting,mysql,Ruby On Rails,Sorting,Mysql,给定以下模式 class User has_many :page_views #[id] end class Page has_many :page_views #[id] end class PageView belongs_to :user belongs_to :page #[id, created_at, updated_at] end 如何查询给定页面的所有用户最近的页面浏览量,按创建日期的顺序排列。每个用户一行,仅显示其最近的视图。您需要为特定页面i

给定以下模式

class User
  has_many :page_views
  #[id]
end

class Page
  has_many :page_views
  #[id]
end

class PageView
  belongs_to :user
  belongs_to :page
  #[id, created_at, updated_at]
end

如何查询给定页面的所有用户最近的页面浏览量,按创建日期的顺序排列。每个用户一行,仅显示其最近的视图。

您需要为特定页面id的每个用户id创建的最大页面视图。这是此查询的SQL表示形式:

SELECT max(created_at) AS last_visit, page_views.* 
FROM page_views 
WHERE (page_id = 1) 
GROUP BY user_id 
ORDER BY last_visit DESC
在Rails 3中,您可以这样编写:

Page.first.page_views.group(:user_id).select('max(created_at) AS last_visit, page_views.*').order('last_visit DESC')
试试这个:

class Page
  has_many :page_views
  has_many :recent_page_views, :class_name => "PageView",
    :joins => "INNER JOIN (
      SELECT     a.id, COUNT(*) AS ranknum
      FROM       page_views AS a
      INNER JOIN page_views AS b ON a.user_id = b.user_id AND 
                                    a.page_id = b.page_id AND 
                                    a.created_at <= b.created_at
      GROUP BY   a.id
      HAVING COUNT(*) = 1
    ) AS d ON (page_views.id = d.id)",
    :order => "page_views.created_at"

 has_many :recent_viewers, :through => :recent_page_views, 
            :source => :user, :order => "page_views.created_at"
end

我对所选零件有问题。如果我去掉“,*”则查询有效,当我将其加回去时,查询中断。如何获得*和上次访问?请为所选组件尝试“max(created_at)as last_vision,page_views.*”。我在上面更新了。它还可以将*放在第一位,例如“选择*,max(创建时间)作为last_Visite FROM”为什么last_Visite字段会以字符串而不是datetime返回?谢谢您的回答!我选择了另一个是因为它简单,不过我也很欣赏你的回答。如果你需要访问任何
User
model属性,那么这个解决方案会更好。在另一个解决方案中,如果您必须获得用户的详细信息,则将对DB进行N次访问。
page.recent_viewers