2013-02-27 24 views
12

मैं वीडियो की श्रृंखला देखने की संख्या रिकॉर्ड कर रहा हूं। अब मैं उन उपयोगकर्ताओं की संख्या का ग्राफ बनाने की कोशिश कर रहा हूं जो हर दिन कोई वीडियो देखते हैं।रेल COUNT SELECT DISTINCT

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

एसक्यूएल

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 

जो सभी वीडियो प्रत्येक दिन देखा के लिए सही परिणाम का उत्पादन पैदा करता है, लेकिन जैसा कि मैंने कहा कि मैं केवल प्रत्येक उपयोगकर्ता एक बार दिखाना चाहते हैं।

एसक्यूएल मैं चाहता हूँ

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 >] 

देता है बल्कि।

कोई विचार?

मैं रेल 3.1 और mysql

उत्तर

26

उपयोग कर रहा हूँ आप distinct.count(:attribute_name) उपयोग कर सकते हैं।

(रेल 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) 
नहीं

का परीक्षण करने में सक्षम है, लेकिन मुझे लगता है कि एसक्यूएल आप के बाद कर रहे हैं उत्पादन होगा।

+0

इस तरह अच्छे है - धन्यवाद – Edward

+2

रेल http://stackoverflow.com/a/ देखना 4 में पदावनत समाधान के लिए 1 9362288/670433 जो मॉडलName.distinct.count (: attribute_name) का उपयोग करना है – s2t2

+0

आप मॉडल के सभी गुणों को कैसे वापस कर सकते हैं? –

11

रेल 4 में, के रूप में अन्य उत्तर में उल्लेख किया है (इस प्रश्न के लिए और कहीं और इसी तरह) वास्तव में क्वेरी में किया जा रहा है एक अतिरिक्त DISTINCT को बढ़ावा मिलेगा (...).uniq.count(:user_id) का उपयोग कर:

SELECT DISTINCT COUNT(DISTINCT user_id) FROM ...

क्या हम वास्तव में करने के लिए है

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

कौन सा हमें देता है:

कर किसी SQL स्ट्रिंग खुद का उपयोग करें

SELECT COUNT(DISTINCT user_id) FROM ...

0

अलग का उपयोग करना चाहिए, रेल 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"

संबंधित मुद्दे