2013-02-26 91 views
5

मैं कई आइटमों के लिए एन हालिया टिप्पणियां प्राप्त करने के लिए एक प्रश्न लिखने की कोशिश कर रहा हूं।MySQL और SQLAlchemy: कई आइटमों के लिए हाल की टिप्पणियां प्राप्त करना

वर्तमान में, मैं आइटम प्रति एक प्रश्न के साथ आइटम के माध्यम से पाशन कर रहा हूँ:

for i in itemIds: 
    Comment.query.filter_by(itemId=i).order_by(Comment.id.desc()).limit(3) 

लेकिन यह वास्तव में धीमी है।

मैं एक ही प्रश्न पूछना चाहता हूं जो सभी टिप्पणियां प्राप्त करता है, लेकिन यह नहीं पता कि कैसे। मैंने union का उपयोग करने का प्रयास किया है लेकिन इसे काम करने के लिए नहीं मिला है। मुझे लगता है कि MySQL, order_by, और union के साथ समस्याएं हैं। मैं इसके प्रभाव के लिए कुछ कोशिश कर रहा हूं:

a = Comment.query.filter_by(itemId=1).order_by(Comment.id.desc()).limit(3) 
b = Comment.query.filter_by(itemId=2).order_by(Comment.id.desc()).limit(3) 
u = union_all(a,b) 
DB.session.query(Comment).select_from(u).all() 

लेकिन यह काम नहीं करता है। यह 'यूनियन के गलत उपयोग और आदेश द्वारा' के बारे में शिकायत करता है।

मैं एक MySQL या SQLAlchemy निंजा नहीं हूं, और घंटों तक इस पर अपने सिर को टक्कर लगी हूं।

कृपया मदद करें! किसी भी संकेतक या सलाह की सराहना की जाएगी।

उत्तर

5

SQL संस्करण के लिए, कृपया http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

जो SQLAlchemy में देता में खंड "प्रत्येक समूह से शीर्ष N पंक्तियों का चयन करें":

c2 = aliased(Comment) 
query = session.query(Comment).filter(
      session.query(func.count(c2.id))\ 
       .filter(c2.id >= Comment.id)\ 
       .filter(c2.item_id == Comment.item_id)\ 
       .order_by(c2.id.desc())\ 
       .correlate(Comment)\ 
       .as_scalar() <= 3)\ 
    .filter(Comment.item_id.in_(itemIds)).all() 
+0

बहुत बढ़िया .. कि यह करता है। बहुत बहुत धन्यवाद! – aspiringwebninja