2010-01-21 11 views
8

(यह SQL join: selecting the last records in a one-to-many relationship पर थ्रेड का django संस्करण है)django में "सबसे बड़ा-एन-प्रति-समूह" क्वेरी कैसे कर सकता है?

मान लीजिए कि मेरे पास ग्राहकों की एक तालिका है और खरीदारी की एक तालिका है। प्रत्येक खरीद एक ग्राहक से संबंधित है। मैं अपनी पिछली खरीदारी के साथ सभी ग्राहकों की एक सूची प्राप्त करना चाहता हूं। क्या यह कच्चे एसक्यूएल के बिना और एकाधिक डेटाबेस प्रश्नों के बिना किया जा सकता है?

+0

के संभावित डुप्लिकेट [Django क्वेरी से अलग श्रेणियाँ सबसे हाल ही में वस्तुओं जाओ] (http://stackoverflow.com/questions/2074514/django --------हालिया-ऑब्जेक्ट्स-से-अलग-श्रेणियों से) – dbn

उत्तर

1
SELECT * 
FROM customers с 
LEFT JOIN 
     purchases p 
ON  p.id = 
     (
     SELECT id 
     FROM purchases pl 
     WHERE pl.customer = c.id 
     ORDER BY 
       pl.customer DESC, pl.date DESC 
     LIMIT 1 
     ) 

सुनिश्चित करें कि आप purchases (customer, date) पर एक समग्र सूचकांक अगर अपनी मेज InnoDB है, या purchases (customer, date, id) पर अपनी मेज MyISAM है अगर बनाओ।

+0

हमें इनओडीबी के लिए इंडेक्स में आईडी की आवश्यकता क्यों नहीं है? – netvope

+0

'@ netvope': क्योंकि 'InnoDB' इंडेक्स व्यवस्थित है और इसमें प्रत्येक सूचकांक में पंक्ति सूचक के रूप में' प्राथमिक कुंजी 'शामिल है। – Quassnoi

3

आप Django में एक प्रश्न में ऐसा नहीं कर सकते हैं। आप अपने सबसे हाल ही खरीद का सिर्फ तारीख इस तरह से ग्राहक प्राप्त कर सकते हैं:

from django.db.models import Max 
customers = Customer.objects.annotate(Max('purchase__date')) 

लेकिन आप स्वचालित रूप से वास्तविक खरीद के लिए उपयोग इस तरह से नहीं मिलता है।

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