PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PostgreSQL के साथ रेल 3.1:GROUP BY का उपयोग समग्र फ़ंक्शन में किया जाना चाहिए

व्यंजक द्वारा उत्पन्न sql मान्य क्वेरी नहीं है, आप user_id . द्वारा समूहीकृत कर रहे हैं और उसके आधार पर कई अन्य क्षेत्रों का चयन करना, लेकिन डीबी को यह नहीं बताना कि उसे अन्य फाइलों को कैसे एकत्रित करना चाहिए। उदाहरण के लिए, यदि आपका डेटा इस तरह दिखता है:

a  | b
---|---
1  | 1
1  | 2
2  | 3

अब जब आप db को a . द्वारा ग्रुप करने के लिए कहते हैं और बी भी लौटाता है, यह नहीं जानता कि मूल्यों को कैसे एकत्रित किया जाए 1,2 . आपको यह बताना होगा कि क्या इसे न्यूनतम, अधिकतम, औसत, योग या कुछ और चुनने की आवश्यकता है। जैसे ही मैं उत्तर लिख रहा था, दो उत्तर मिले हैं जो इस सब को बेहतर ढंग से समझा सकते हैं।

हालांकि आपके उपयोग के मामले में, मुझे लगता है कि आप डीबी स्तर पर समूह नहीं चाहते हैं। चूंकि केवल 10 कलाएँ हैं, आप उन्हें अपने आवेदन में समूहित कर सकते हैं। हालांकि इस पद्धति का उपयोग हजारों कलाओं के साथ न करें:

 arts = Art.all(:order => "created_at desc", :limit => 10)
 grouped_arts = arts.group_by {|art| art.user_id}
 # now you have a hash with following structure in grouped_arts
 # { 
 #    user_id1 => [art1, art4],
 #    user_id2 => [art3],
 #    user_id3 => [art5],
 #    ....
 # }

संपादित करें: latest_arts चुनें, लेकिन प्रति उपयोगकर्ता केवल एक कला

बस आपको sql का विचार देने के लिए (इसका परीक्षण नहीं किया है क्योंकि मेरे सिस्टम पर RDBMS स्थापित नहीं है)

SELECT arts.* FROM arts
WHERE (arts.user_id, arts.created_at) IN 
  (SELECT user_id, MAX(created_at) FROM arts
     GROUP BY user_id
     ORDER BY MAX(created_at) DESC
     LIMIT 10)
ORDER BY created_at DESC
LIMIT 10

यह समाधान व्यावहारिक धारणा पर आधारित है, कि एक ही उपयोगकर्ता के लिए दो कलाओं में समान उच्चतम निर्मित_एट नहीं हो सकते हैं, लेकिन यह गलत हो सकता है यदि आप बड़ी मात्रा में कलाओं का आयात या प्रोग्रामिक रूप से निर्माण कर रहे हैं। अगर धारणा सच नहीं होती है, तो एसक्यूएल अधिक विकसित हो सकता है।

संपादित करें: क्वेरी को Arel में बदलने का प्रयास करें:

Art.where("(arts.user_id, arts.created_at) IN 
             (SELECT user_id, MAX(created_at) FROM arts
                GROUP BY user_id
                ORDER BY MAX(created_at) DESC
                LIMIT 10)").
    order("created_at DESC").
    page(params[:page]).
    per(params[:per])


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. जेपीए अपरकेस टेबल नाम

  2. मोचा परीक्षण Knex के साथ PostgreSQL मुझे एक MigrationLocked त्रुटि दे रहा है

  3. पोस्टग्रेज:एक-से-अनेक खोज के लिए फ़्लोट सरणियों की कोसाइन समानता पर अनुक्रमणिका

  4. SQL इंजेक्शन के प्रति संवेदनशील न होने के लिए मैं अपनी क्वेरी में अपने पायथन एफ-स्ट्रिंग को कैसे ठीक कर सकता हूं?

  5. PostgreSQL:प्राथमिक कुंजी या अद्वितीय के लिए कस्टम नाम प्रदान करना संभव है?