2013-02-27 10 views
12

Kullanıcıların bir dizi video izlediğini kaydediyorum. Şimdi her gün video izleyen kullanıcıların sayısını gösteren bir grafik oluşturmaya çalışıyorum.raylar COUNT SELECT DISTINCT

UserVideoWatching.where("created_at >= ? AND user_id != ?",1.month.ago, User.elephant.id).group("DATE(created_at)").reorder('created_at').count 

sql her gün izledim tüm videolar için doğru sonuçlar üretir

SELECT COUNT(*) AS count_all, DATE(created_at) AS date_created_at FROM `user_video_watchings` WHERE (created_at >= '2013-01-27 10:43:24' AND user_id != 7) GROUP BY DATE(created_at) ORDER BY created_at 

üretir, ama dediğim gibi ben sadece bir kez her kullanıcı göstermek istiyorum.

istediğim sql

SELECT COUNT(DISTINCT user_id) AS count_all, DATE(created_at) AS date_created FROM `user_video_watchings` WHERE (created_at >= '2013-01-27 10:33:18' AND user_id != 7) GROUP BY DATE(created_at) ORDER BY created_at 

yüzden ne istediğini yapacağını
UserVideoWatching.where("created_at >= ? AND user_id != ?",1.month.ago, User.elephant.id).group("DATE(created_at)").reorder('created_at').select('COUNT(DISTINCT user_id) AS count_all, DATE(created_at) AS date_created') 

düşünce olduğunu. Ancak bu, bir karma yerine

'u verir.

Herhangi bir fikrin var mı?

Ben Sen distinct.count(:attribute_name) kullanabilirsiniz raylar 3.1 ve mysql

cevap

26

kullanıyorum. (: Yerine count(:user_id, distinct: true) Raylar 3 Kullanımda) Böylece

:

UserVideoWatching.where("created_at >= ? AND user_id != ?", 1.month.ago, User.elephant.id) 
.group("DATE(created_at)").reorder('created_at').distinct.count(:user_id) 

Değil test edebilmek ama bu peşinde olduğunuz SQL üretmek düşünüyorum.

SELECT DISTINCT COUNT(DISTINCT user_id) FROM ...

biz aslında gereken şey: diğer yanıtlar sözü (Bu soru için ve başka bir yerde SO üzerine) aslında sorguda olan ekstra DISTINCT yol açacaktır olarak (...).uniq.count(:user_id) kullanarak Raylar 4'te

+0

- teşekkürler – Edward

+2

http://stackoverflow.com/a/ bakın 4 raylar kullanımdan kaldırılmış ModelName.distinct.count (: attribute_name) kullanmak için çözüm için 19362288/670433 – s2t2

+0

Modelin tüm özelliklerini nasıl döndürürsünüz? –

11

, bize verdiği

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

:

yapmak SQL dizesi kendimizi kullanmaktır

SELECT COUNT(DISTINCT user_id) FROM ...

0

raylar 5.0.1, ayrı eşit uniq içinde, ayrı kullanabilirsiniz, ancak olmalı: yolu daha güzel [11] pry(main)> Needremember.distinct.count(:word) (1.1ms) SELECT DISTINCT COUNT(DISTINCT "needremembers"."word") FROM "needremembers" [12] pry(main)> Needremember.uniq.count(:word) DEPRECATION WARNING: uniq is deprecated and will be removed from Rails 5.1 (use distinct instead) (called from __pry__ at (pry):12) (0.6ms) SELECT DISTINCT COUNT(DISTINCT "needremembers"."word") FROM "needremembers"