2008-08-31 79 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 ...

相關問題