在 id 上选择 distinct 以返回一行,但能够访问其他列值(rails 关联)

Posted

技术标签:

【中文标题】在 id 上选择 distinct 以返回一行,但能够访问其他列值(rails 关联)【英文标题】:Select distinct on id to return a row, but able to access other column values (rails association) 【发布时间】:2012-01-06 06:56:24 【问题描述】:

好的,我正在对 Rails 中的关联进行内部连接,如下所示:

@visits = @customer.visits.joins(:messages).select("distinct(visits.id)")

这将返回唯一的访问 ID,但是我想循环访问这些访问,并访问其关联(每次访问也附加了一个 merchant_id)。这个内部连接的问题是只返回 id 所以当我做这样的事情时:

@visits.each do |v|
  merchant = v.merchant
end

我最终得到了一个 nil 类。

如何根据唯一的 visit.id 选择“访问”,同时返回该行中的所有其他列?分组?

【问题讨论】:

看起来我实际上可以使用 .group("evisits.id") 而不是 select 语句来做到这一点。稍后我会将此作为答案发布,但我很想听听其他人怎么说。 【参考方案1】:

您选择的只是 id,这是正确的。既然你想要一个对象,你有两个选择。所以你真正想要的是:

Visit.where(:visit_id => @customers.visits.select("distinct(id)"))

这相当于:

"SELECT * FROM VISITS WHERE VISITS.ID IN (SELECT DISTINCT(ID) FROM VISITS WHERE VISITS.CUSTOMER_ID IN ?)", <id_list>

我不确定“消息”在您的架构中的哪个位置,但它基本上只是上述查询中的一个联接。有时,找出 SQL 会很有帮助,如果遇到问题,可以回溯到 ActiveRecord 语法。

【讨论】:

以上是关于在 id 上选择 distinct 以返回一行,但能够访问其他列值(rails 关联)的主要内容,如果未能解决你的问题,请参考以下文章

在一列上选择 DISTINCT,返回多个其他列(SQL Server)

在JPA上选择DISTINCT

我如何(或我可以)在多列上选择 DISTINCT?

在正则表达式上选择一行没有重复条目

在一列上选择 DISTINCT

使用 T-SQL 中的 OVER 子句在除一列之外的所有列上选择 DISTINCT