【问题标题】:Greatest-n-per-group rails ActiveRecord SQLGreatest-n-per-group rails ActiveRecord SQL
【发布时间】:2015-01-20 07:23:42
【问题描述】:

我有一个 ActiveRecord 模型 Post,其中包含字段 created_atscore。我想在最近创建的 50 个中按分数订购 Posts。所以基本上SQL是

SELECT * FROM
(SELECT * FROM Posts ORDER BY created_at DESC LIMIT 50) Sorted_Posts
ORDER BY score DESC

不幸的是,我不确定如何在 Rails 中执行此操作。我不喜欢使用原始 SQL 来完成此操作,因为查询中有许多未显示的过滤器会真正使原始 SQL 复杂化。我研究了可能使用to_sql 并去掉SELECT * FROM POSTS 前缀,然后将其放入wherefind_by_sql 函数中,但我觉得这可能是hacky 并可能导致SQL 注入?

谢谢。

【问题讨论】:

    标签: mysql sql ruby-on-rails activerecord greatest-n-per-group


    【解决方案1】:

    可能是这样的:

    Order.where(id: Order.order(:created_at => :desc).limit(50).ids).order(:score => :desc)

    【讨论】:

      【解决方案2】:

      试试这个:

      Post.order('created_at DESC').limit(50).order('score DESC')
      

      【讨论】:

      • 感谢您的建议,但我试过了,根据文档,它遵循 SQL 查询的标准模型。所以它产生的实际上是SELECT * FROM Posts ORDER BY created_at DESC, score DESC LIMIT 50
      【解决方案3】:

      不确定这是否适用于您的用例,但这是完成您所要求的一种方法

      Post.from("(#{Post.order('created_at DESC').limit(50).to_sql}) posts").order('score DESC')
      

      本质上,您正在构建内部查询,然后将其转换为 SQL 文字并使用插值将其放入外部查询的 from 部分。

      【讨论】:

        猜你喜欢
        • 2021-02-14
        • 1970-01-01
        • 2011-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多