2008-08-31 76 views

回答

79

什么你要去的是下面的SQL:

SELECT COUNT(DISTINCT date) FROM records 

的ActiveRecord有这个建于:SQL的

Record.count('date', :distinct => true) 
+1

达到的要求是有可能做到这一点使用多个列的范围是什么? – 2012-11-19 21:38:22

+13

现在不推荐使用(导轨4),请参阅下面的答案。 – Yule 2013-10-14 14:14:37

2

此外,请确保您的数据库中的字段有一个索引,否则该查询将很快变得流畅。

(这是更好的做到这一点的SQL,否则你拉动整个数据库表到内存只是回答的数量。)

+1

nex3的答案将正确地生成`COUNT` SQL语句。 http://guides.rubyonrails.org/active_record_querying.html#calculations – Kevin 2013-09-26 22:27:01

82

这在轨道4,5稍微改变及以上:distinct => true现在已经过时。用途:

Record.distinct.count('date') 

或者,如果你想要的日期和数量:

Record.group(:date).distinct.count(:date) 
8

详图答案:

Post.create(:user_id => 1, :created_on => '2010-09-29') 
Post.create(:user_id => 1, :created_on => '2010-09-29') 
Post.create(:user_id => 2, :created_on => '2010-09-29') 
Post.create(:user_id => null, :created_on => '2010-09-29') 

Post.group(:created_on).count 
# => {'2010-09-29' => 4} 

Post.group(:created_on).count(:user_id) 
# => {'2010-09-29' => 3} 

Post.group(:created_on).count(:user_id, :distinct => true) # Rails <= 3 
Post.group(:created_on).distinct.count(:user_id) # Rails = 4 
# => {'2010-09-29' => 2} 
9

正如我所提到here,Rails中4,使用(...).uniq.count(:user_id)如前所述在其他答案中(针对此问题和SO中的其他答案)实际上会导致在查询中多出一个DISTINCT

SELECT DISTINCT COUNT(DISTINCT user_id) FROM ...

其实我们要做的是使用SQL字符串自己:

(...).count("DISTINCT user_id")

这给了我们:

SELECT COUNT(DISTINCT user_id) FROM ...

相关问题