【问题标题】:Return only unique records in this ActiveRecord query仅返回此 ActiveRecord 查询中的唯一记录
【发布时间】:2015-12-10 09:05:45
【问题描述】:

我在 Rails 3.2 / Postgres 中有一个稍微复杂的 ActiveRecord 查询,它返回与 所有文档相关最相关的文档用户过去收藏过。

问题是尽管指定了uniq,我的查询返回不同的文档记录:

 Document.joins("INNER JOIN related_documents ON 
                 documents.docid = related_documents.docid_id")
         .select("documents.*, related_documents.relevance_score")
         .where("related_documents.document_id IN (?)",    
                  some_user.favorited_documents)
         .order("related_documents.relevance_score DESC")
         .uniq
         .limit(10)

我使用RelatedDocument 连接表,通过related_document.relevance_score 对每个关系进行排序,我用它在对前10 名进行抽样之前对查询结果进行排序。(有关架构描述,请参阅this question。)

问题是因为我select("documents.*, related_documents.relevance_score"),同一个文档记录多次返回不同的relevance_scores被认为是唯一的结果。 (即,如果文档是多个收藏文档的相关文档。)

无论related_document.relevance_score如何,我如何返回唯一的Documents

我尝试将select 拆分为两个单独的选择,并在查询中更改uniq 的位置,但没有成功。

不幸的是,我必须select("related_documents.relevance_score") 才能按此字段对结果进行排序。

谢谢!

更新 - 解决方案

感谢下面的 JethrooGROUP BY 是必要的补充,给了我以下工作查询:

 Document.joins("INNER JOIN related_documents ON 
                 documents.docid = related_documents.docid_id")
         .select("documents.*, max(related_documents.relevance_score)")
         .where("related_documents.document_id IN (?)",    
                  some_user.favorited_documents)
         .order("related_documents.relevance_score DESC")
         .group("documents.id")
         .uniq
         .limit(10)

【问题讨论】:

    标签: sql ruby-on-rails postgresql activerecord


    【解决方案1】:

    您是否尝试将其按documents.docid 分组,参见http://guides.rubyonrails.org/active_record_querying.html#group

    【讨论】:

    • 感谢 jethroo,让我找到了正确的解决方案。但是,我确实需要更改查询的其他一些部分,以便能够按所有选定的列进行分组。我已将工作查询添加为问题的更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    相关资源
    最近更新 更多