当前位置: 首页 > 面试题库 >

将SQL查询转换为Rails AREL查询?

刘狐若
2023-03-14
问题内容

多亏了Erwin Brandstetter在我之前的问题“具有has_many关系的订单”中的帮助,我的SQL查询才能正常工作。

如何将该SQL转换为ActiveRecords或AREL查询以在范围中使用?

SELECT a.*
FROM   articles a
LEFT   JOIN (
   SELECT DISTINCT ON (article_id)
          article_id, value
   FROM   metrics m
   WHERE  name = 'score'
   ORDER  BY article_id, date_created DESC
   ) m ON m.article_id = a.id
ORDER  BY m.value DESC;

我最近来的是在朋友的帮助下…

scope :highest_score, select("articles.*").joins("LEFT JOIN (SELECT 
      DISTINCT ON (article_id) article_id, value FROM metrics WHERE name = 
      'score' ORDER  BY article_id, date_created DESC) ON metrics.article_id = 
      articles.id").order("metrics.value DESC")

…这给了我一个错误:

ActiveRecord::StatementInvalid: PGError:
      ERROR:  subquery in FROM must have an alias

更新:

我之前的问题对相关的架构和查询有完整的描述。但是基本上Articles have_many Metrics和一个Metric具有一个name和一个value。我查询订单Articles由最高 value的的最近 Metric用name = ‘score’。

谢谢!

解决方案:

感谢Mattherick为我指出正确的方向!他的查询在SQLite上有效,但是由于postgresql(适当的)对歧义的不宽容,最终的工作范围是:

scope :highest_score, joins(:metrics).where("metrics.name" => "score")
      .order("metrics.value desc").group("metrics.article_id", 
      "articles.id", "metrics.value", "metrics.date_created")
      .order("metrics.date_created desc")

马瑟里克(Matherick)在评论中提到的SO问题在这里解释了这个问题-以及为什么sqlite接受歧义查询而不是postgresql拒绝是错误的。对我来说,使用本地生产中使用相同数据库的好处就是一个很好的例子。


问题答案:

我认为这应该工作

class Article < ActiveRecord::Base

  scope :highest_score, lambda { Article.joins(:metrics).where("metrics.name" => "score").order("metrics.value").group(:article_id).order("metrics.article_id desc").order("metrics.date_created desc") }

end


 类似资料:
  • 问题内容: 我想将以下SQL查询转换为Elasticsearch之一。谁能帮上忙 我尝试了以下方法: 但不确定我是否做对了,因为它无法验证结果。似乎要在聚合内添加查询。 问题答案: 假设您使用Elasticsearch 2.x,则有可能在Elasticsearch中 具有 -semantics。我不知道2.0之前的可能性。 您可以使用新的Pipeline Aggregation Bucket Se

  • 我有两个表,它们通过一个外键来维护它们之间的父子关系。查询如下所示。我想在使用jpa的同时使用标准版。所以有人可以帮助我使用标准版吗 表“child”的“notification\u id\u child”列是外键,并引用表“parent”的主键。

  • 问题内容: 我在SQL Server 2008中具有下表: 我需要创建以下输出的查询: 列可以固定为[Mitarbeiter1]-[Mitarbeiter5],因为每个Filiale的行数不能超过5行。 非常感谢您的帮助! 问题答案: 使用SQL Server 2008,将Pivot和Rank函数组合在一起,可以为每个雇员数量提供理想的结果。首先,我们为每个分支中的每个员工分配一个ID,从每个新分

  • 问题内容: 我有一个如下所示的表。我的问题是:如何将列转换为行?我正在使用Microsoft SQL Server 我需要像下面的操作 怎么做?谢谢 问题答案: 您的资料 询问 结果集

  • 在我们的应用程序中,数据库将从SQL Server更改为DB2。

  • 我是Django ORM的新手,正在努力将以下查询转换为ORM。感谢任何帮助/指导。日期/时间不按特定顺序排列。 提前谢谢 SQL查询:<br>从<br>中选择<br>A.Person_id、<br>A.Dept_id、<br>A.score_date、<br>A.score<br>作为<br>内部联接<br>(从借款者deptscore分组中选择Person_ id、Dept_ id、MAX(s