22

ユーザーが一連の動画を視聴した回数を記録しています。現在、毎日ビデオを視聴しているユーザーの数のグラフを作成しようとしています。

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

これにより、毎日視聴されたすべての動画に対して正しい結果が得られますが、前述したように、各ユーザーに 1 回だけ表示したいと考えています。

私が欲しい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 を使用しています

4

3 に答える 3

36

使用できますdistinct.count(:attribute_name)

(Rails 3count(: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 が生成されると思います。

于 2013-02-27T11:17:37.297 に答える
19

Rails 4 では、他の回答 (この質問および SO の他の場所) で述べられているように使用すると、実際にはクエリに(...).uniq.count(:user_id)余分なものが含まれます。DISTINCT

SELECT DISTINCT COUNT(DISTINCT user_id) FROM ...

実際にやらなければならないことは、SQL 文字列を自分で使用することです。

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

これにより、次のことがわかります。

SELECT COUNT(DISTINCT user_id) FROM ...

于 2015-10-12T20:00:04.770 に答える