在Rails 3中按照唯一列值选择所有列

4
在Rails 3中,如何基于唯一列值选择行?我需要获取所有列,例如:
SELECT COUNT(DISTINCT date) FROM records

这只返回日期列,但我想要所有的列(名称、日期、年龄、创建时间),而不仅仅是日期。
谢谢您的帮助。

3
如果两行日期相同,你想要哪一行? - mu is too short
1
你实际上是如何运行第一个查询的? - Jonathan
4个回答

7

问题在于,按照定义,可能存在多条具有相同日期的记录。需要在用户空间中使用逻辑来确定要使用具有唯一日期的多个记录中的哪一个。以下是获取这些行的一些代码:

Record.select("distinct date").each do |record|
    records = Record.find_by_date record.date
    puts records.count # do something with the records
end

如果你想要的是多列中的唯一性,那么在distinct查询中列出所有相关列:

Record.select("distinct date, name, age, created_at").each do |record|
    puts record.date
    puts record.name
    puts record.age
    puts record.created_at
    # ``record'' still represents multiple possible records
end

您使用 distinct 的事实意味着每个“行”实际上代表了 n 行,因此数据库不知道从哪些 n 行中获取剩余的列。这就是为什么它仅返回使用 distinct 的列。它不能做其他操作...

5

我认为这会对你有所帮助

Model.find(:all, :select => 'DISTINCT name, date, age, created_at')

请使用它并让我知道。


4
Model.group(:column)

针对您的情况:

Record.group(:date)

这将返回所有列,而不重复包含“日期”。

4
"<model>.id"列必须出现在GROUP BY子句中或者在聚合函数中使用。 - JosephK

1
对于Rails 3.2及以上版本,Model.select('DISTINCT name, date, age, created_at')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接