2011-08-20 26 views
51

इस क्वेरी"द्वारा क्रमबद्ध" परिणाम "समूह द्वारा" गिनती?

Message.where("message_type = ?", "incoming").group("sender_number").count 

मुझे एक हैश वापस आ जाएगी।

OrderedHash {"1234"=>21, "2345"=>11, "3456"=>63, "4568"=>100} 

अब मैं प्रत्येक समूह की गणना करके आदेश देना चाहता हूं। मैं क्वेरी के भीतर ऐसा कैसे कर सकता हूं।

उत्तर

82

ऐसा करने का सबसे आसान तरीका केवल मूल क्वेरी में ऑर्डर क्लॉज जोड़ना है। आप गणना विधि एक विशेष क्षेत्र देते हैं, यह नाम count_ {स्तंभ} है, जो एक आदेश कॉल जोड़कर उत्पन्न एसक्यूएल में इस्तेमाल किया जा सकता है के साथ एक आउटपुट स्तंभ उत्पन्न करेगा:

Message.where('message_type = ?','incoming') 
     .group('sender_number') 
     .order('count_id asc').count('id') 
+1

Nopes यह मेरे लिए काम नहीं कर रहा है .. –

+1

आप किस डेटाबेस इंजन का उपयोग कर रहे हैं? रेल का कौन सा संस्करण, और जेनरेट एसक्यूएल क्या है? मुझे रेलवे 3.0.7 पर ठीक काम कर रहा एक टेस्ट केस (अलग मॉडल) मिला है ... उदा। '@test = Price.where ('कीमत शून्य नहीं है') समूह (: price_date) .order ('count_price asc')। गिनती ('मूल्य')', जो 'SELECT COUNT ("कीमतें"। "मूल्य उत्पन्न करती है ") AS count_price, price_date AS" कीमत "से मूल्य_डेट (कीमत शून्य नहीं है) GRO_ द्वारा मूल्य_डेट करें ORDER द्वारा count_price asc' –

+0

इसके लिए बहुत बहुत धन्यवाद। इसने मुझे अपनी क्वेरी से इतना समय बचाया कि मैं इससे पहले कैसे कर रहा था! सबसे महत्वपूर्ण सबक: मैंने सीखा कि गिनती विधि 'नाम count_ {कॉलम} नाम के साथ आउटपुट कॉलम उत्पन्न करेगी! धन्यवाद! – Yavin4

13

जब मैं इस की कोशिश की, रेल मुझे इस त्रुटि दे दी

SQLite3::SQLException: no such column: count_id: SELECT COUNT(*) AS count_all, state AS state FROM "ideas" GROUP BY state ORDER BY count_id desc LIMIT 3 

सूचना यह कहना है कि चयन करें ... के रूप में count_all

तो मैं @ साइमन के जवाब से क्वेरी इस तरह दिखेगा के लिए अद्यतन और यह मेरे

लिए काम करता है
+0

यह सुनिश्चित नहीं है कि कौन सी एआर संस्करण इसे' 'count_id' के बजाय count_all' लेकिन 4.2.1 में, '.order (" count_id desc ")' काम करता है। – sameers

+0

मेरे लिए काम करता है। शायद आप .count ('id') चूक गए? – mahemoff

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