2013-01-09 14 views
6

साथ विशिष्ट का चयन करें यह कठिन की तुलना में यह होना चाहिए लगता है:Postgres रेल आदेश

मैं एक मेज सॉर्ट करने के लिए यह copy_count है द्वारा, तो एक अद्वितीय शीर्षक के साथ ही घटनाओं का चयन करें, और पहले करने के लिए कि क्वेरी की सीमा में सक्षम होना चाहते 99.

Event.order("copy_count DESC").select("DISTINCT ON (events.title) *").limit(99) 

यह एक त्रुटि फेंकता है:

ActiveRecord::StatementInvalid: PG::Error: ERROR: SELECT DISTINCT ON expressions must match initial ORDER BY expressions 

कौन सा सुझाव है कि मैं DISTINCT चालू पर copy_count जोड़ने की जरूरत है, लेकिन यह भी केवल वापस अद्वितीय copy_count रिकॉर्ड whi खींच होगा च वही हो सकता है!

नोट: copy_count द्वारा ऑर्डर पहले होना चाहिए।

धन्यवाद

+0

तो, आप 99 'events.title' उच्चतम 'copy_count' के साथ डुप्लिकेट' events.title' के बिना चाहते हैं? –

+0

यह सही है – jay

उत्तर

9

शुद्ध एसक्यूएल यह कैसा दिखाई देगा के लिए:

SELECT * 
FROM (SELECT DISTINCT ON (events.title) * 
     FROM events 
     ORDER BY events.title, events.copy_count DESC) top_titles 
ORDER BY events.copy_count DESC 
LIMIT 99 

लेकिन मैं नहीं जानता, कैसे आतंक विरोधी में यह लिखने के लिए।

+5

इसे एआर/एरल वाक्यविन्यास में परिवर्तित करने के लिए बहुत अच्छा होगा। – freemanoid

+1

हाँ सवाल रेल निर्दिष्ट करता है - किसी को यह पता है कि एआर क्वेरी इंटरफेस के साथ इसे कैसे निर्दिष्ट किया जाए? – Todd

4

इस प्रयास करें:

Event.order("copy_count DESC").limit(99).select(:title).uniq 
2

इसका मतलब है कि जरूरतों द्वारा आदेश "events.title, copy_count DESC" किया जाना है। DISTINCT चालू करने की आवश्यकता है कि आपके द्वारा क्रमबद्ध पहली चीज़ डायबिंट की कॉलम की सूची है। यदि आप प्रति शीर्षक उच्चतम परिणाम प्राप्त करने का प्रयास कर रहे हैं, तो आपको प्रतिलिपि द्वारा क्रमबद्ध करने से पहले उन्हें पहले शीर्षक के साथ पंक्तियों के सेट में समूहित करना होगा। यदि आप ऐसा करने की कोशिश नहीं कर रहे हैं, तो DISTINCT चालू निर्माण नहीं है। इस प्रकार भाव

SQL ERROR: SELECT DISTINCT ON expressions must match initial ORDER BY expressions 

द्वारा क्रम में

Event.select("DISTINCT ON (events.title) *").order("events.title, copy_count DESC").limit(99) 

यह इसलिए होता है, क्योंकि जब आप DISTINCT ON का उपयोग करते हैं, आप अपनी अभिव्यक्ति का उपयोग करना चाहिए (उदाहरण के लिए events.title),:

1

इस प्रयास करें आपको ऑर्डर स्टेटमेंट

0

यह है कि मैंने कोशिश की है:

में इवेंट स्टेटमेंट के ठीक बाद copy_count कॉलम जोड़ने की आवश्यकता है।
Event.select('events.copy_count, RANDOM()').order('Random()').limit(10) 
संबंधित मुद्दे