【发布时间】: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") 才能按此字段对结果进行排序。
谢谢!
更新 - 解决方案
感谢下面的 Jethroo,GROUP 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