2011-06-13 15 views
5

बनाने में मदद की ज़रूरत है यह एसक्यूएल है जिसे मुझे अपने ओआरएम के माध्यम से उत्पन्न करने के लिए एसक्लाक्लेमी की आवश्यकता है।एक एसक्यूएलकेमी क्वेरी + सबक्वायरी

SELECT 
    * 
FROM 
    notes 
WHERE 
    notes.student_id == {student_id} 
    OR 
    notes.student_id IN (
     SELECT 
      * 
     FROM 
      peers 
     WHERE 
      peers.student_id == {student_id} 
      AND 
      peers.date_peer_saved >= notes.date_note_saved 
    ) 

एसक्यूएल अनचाहे है। मैंने इसे लिखने के लिए लिखा है जो मुझे स्क्लाक्लेमी की ज़रूरत है।

असल में, लॉग इन छात्र को सहेजे गए notes की सूची देखना चाहिए। केवल notes छात्र को देखना चाहिए, हालांकि, वे स्वयं द्वारा पोस्ट किए गए हैं या उनके साथियों में से एक द्वारा पोस्ट किए गए हैं - लेकिन केवल उन सहकर्मियों को नोट किया गया था जब वे नोट सहेजे गए थे।

इस तरह, एक छात्र दूसरे छात्र द्वारा पोस्ट किए जाने वाले नोट्स नहीं देख पाएंगे।

मुझे एसक्यूएलकेमी के ओआरएम में चलाने के लिए इसे प्राप्त करने में परेशानी हो रही है। कोई मदद?

उत्तर

0

शायद यह इसलिए है क्योंकि क्वेरी के साथ समस्याएं हैं।

ऐसा लगता है कि आप एक छात्र आईडी के लिए सभी नोट देखना चाहते हैं जहां date_peer_saved है> = date_note_saved

समस्या यह है कि notes और peers तालिका student के साथ कई से एक रिश्ते हैं। इसका अर्थ यह है कि आप peers के रिकॉर्ड फ़िल्टर करने की कोशिश कर रहे हैं जहां कई नोट्स और तुलना करने के लिए कई सहकर्मी हो सकते हैं।

आपको इस तरह से सभी तीन तालिकाओं में शामिल होने की आवश्यकता है कि peers का प्रत्येक रिकॉर्ड notes के एक रिकॉर्ड से संबंधित है। यदि यह आपके लिए लागू नहीं होता है तो आपको उस चीज़ पर पुनर्विचार करना होगा जो आप वास्तव में पूछ रहे हैं।

शायद आप MAX_ date_saved> MAX का MAX_note_saved MAX को फ़िल्टर करना चाहते हैं?

8

असल में, आप .subquery() विधि का उपयोग उप-क्वेरी प्राप्त करने के लिए कर सकते हैं जिसे आप किसी अन्य सशर्त में रख सकते हैं।

कुछ

subq = sess.query(Peers.id).filter(and_(Peers.student==student, XXX)).subquery() 

की तरह फिर

notes = sess.query(Notes).filter(or_(Notes.student==student, Notes.studing.in_(subq))).all() 

(भी अपरीक्षित है और इस वास्तविक क्वेरी के साथ काम नहीं है, लेकिन केवल आपके विचार दे करने के लिए)।

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