rails COUNT SELECT DISTINCT

Edw*_*ard 15 mysql ruby-on-rails count distinct

我正在记录用户观看一系列视频的次数.现在,我正在尝试制作每天观看任何视频的用户数量的图表.

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

生成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
Run Code Online (Sandbox Code Playgroud)

这会为每天观看的所有视频产生正确的结果,但正如我所说,我只想向每位用户展示一次.

我想要的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
Run Code Online (Sandbox Code Playgroud)

所以我认为

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')
Run Code Online (Sandbox Code Playgroud)

会做我想做的事.但这给了

[#<UserVideoWatching >, #<UserVideoWatching >]
Run Code Online (Sandbox Code Playgroud)

而不是哈希.

有任何想法吗?

我正在使用rails 3.1和mysql

Mik*_*ell 30

你可以用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)
Run Code Online (Sandbox Code Playgroud)

无法测试,但我认为这将产生你想要的SQL.

  • 在rails 4中已弃用,请参阅http://stackoverflow.com/a/19362288/670433以获取使用ModelName.distinct.count(:attribute_name)的解决方案 (2认同)

Jac*_*lyn 15

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