簡體   English   中英

rails COUNT SELECT DISTINCT

[英]rails 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

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

這會為每天觀看的所有視頻產生正確的結果,但正如我所說,我只想向每個用戶展示一次。

我想要的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

所以我認為

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')

會做我想做的事。 但這給了

[#<UserVideoWatching >, #<UserVideoWatching >]

而不是哈希。

有任何想法嗎?

我正在使用rails 3.1和mysql

您可以使用distinct.count(:attribute_name)

(在Rails 3中使用: count(:user_id, distinct: true)代替)

從而:

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

無法測試,但我認為這將產生你想要的SQL。

在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 ...

應該使用distinct,在rails 5.0.1中,不同的uniq,但是

[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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM