2008-08-31 34 views

Trả lời

79

gì bạn đang đi là SQL sau đây:

SELECT COUNT(DISTINCT date) FROM records 

ActiveRecord đã này được xây dựng trong:

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

Có thể làm điều này bằng nhiều cột như một phạm vi? –

+13

Điều này hiện không còn được dùng nữa (đường ray 4), xem câu trả lời bên dưới. – Yule

16

Bên ngoài của SQL:

Record.find(:all).group_by(&:date).count 

ActiveSupport của Enumerable#group_by là không thể thiếu .

2

Ngoài ra, hãy đảm bảo bạn có chỉ mục trên trường trong db của bạn, nếu không truy vấn đó sẽ nhanh chóng trở thành dấu gạch chéo.

(Đó là tốt hơn để làm điều này trong SQL, nếu không bạn kéo toàn bộ bảng db vào bộ nhớ chỉ để trả lời câu đếm.)

+1

Câu trả lời của nex3 sẽ tạo chính xác câu lệnh SQL 'COUNT'. http://guides.rubyonrails.org/active_record_querying.html#calculations – Kevin

+1

Mẹo hay về chỉ mục. – Kevin

82

này đã thay đổi một chút trong đường ray 4 trở lên :distinct => true hiện đang bị phản đối. Sử dụng:

Record.distinct.count('date') 

Hoặc nếu bạn muốn ngày và số lượng:

Record.group(:date).distinct.count(:date) 
+4

Nó không hiệu quả với tôi. Sử dụng '.count ('DISTINCT date')' – collimarco

+3

Tôi đã sử dụng 'Record.group (: date) .count.count'. – jayp

8

Quy định chi tiết câu trả lời:

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

Như tôi đã đề cập here, trong Rails 4, sử dụng (...).uniq.count(:user_id) như đã đề cập trong các câu trả lời khác (cho câu hỏi này và các nơi khác trên SO) sẽ thực sự dẫn đến một số DISTINCT bổ sung trong truy vấn:

SELECT DISTINCT COUNT(DISTINCT user_id) FROM ...

Những gì chúng ta thực sự phải làm là sử dụng một chuỗi SQL mình:

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

nào cho chúng ta:

SELECT COUNT(DISTINCT user_id) FROM ...

Các vấn đề liên quan