2010-01-21 16 views
8

Müşterilerin bir masa ve satın almaların bir tablo varDjango'da "grup başına en büyük" sorgu nasıl yapılır?

varsayalım (bu django SQL join: selecting the last records in a one-to-many relationship de dişin sürümüdür). Her satın alma bir müşteriye aittir. Son satın alma işlemleriyle birlikte tüm müşterilerinin bir listesini almak istiyorum. Ham SQL olmadan ve çoklu veritabanı sorguları olmadan yapılabilir mi?

+0

[farklı kategorilerden En Son Nesneleri alın Django Sorgu] olası yinelenen (http://stackoverflow.com/questions/2074514/django -kendi-bu-son-son-nesneleri-farklı-kategoriler) – dbn

cevap

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 
     ) 

tablo InnoDB ise veya purchases (customer, date, id) üzerinde tablo MyISAM olup olmadığını purchases (customer, date) bir bileşik endeksi olduğundan emin olun.

+0

Neden InnoDB için endeksinde id ihtiyacımız yok? – netvope

+0

'@ netvope': çünkü 'InnoDB' dizini düzenlenmiş ve örtülü olarak her dizinde bir satır işaretçisi olarak 'PRIMARY KEY' içerir. – Quassnoi

3

Bunu Django'da bir sorguda yapamazsınız. Böyle onların en son satın alma sadece tarih ile müşteriyi elde edebilirsiniz:

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

ancak otomatik olarak bu yolu fiili satın aldığınız erişimi alamadım.

Sen benzer bir tartışma bakmak olabilir