2010-01-21 4 views
8

SQL join: selecting the last records in a one-to-many relationship에있는 스레드의 장고 버전입니다.django에서 "그룹당 최대 n 개"쿼리를 수행하는 방법은 무엇입니까?

고객 표와 구매 표가 있다고 가정합니다. 각 구매는 한 고객에게 속합니다. 마지막 구매와 함께 모든 고객의 목록을 얻고 싶습니다. 원시 SQL없이 여러 데이터베이스 쿼리없이 수행 할 수 있습니까?

+0

[다른 카테고리에서 가장 최근 객체를 가져옵니다 장고 쿼리]의 중복 가능성 (http://stackoverflow.com/questions/2074514/django -query-that-get-most-recent-objects-from-different-categories) – 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 
     ) 

는 테이블이 InnoDB 경우, 또는 purchases (customer, date, id)에 테이블이 MyISAM 경우 당신이 purchases (customer, date)에 복합 인덱스가 있는지 확인합니다.

+0

InnoDB의 인덱스에 id가 필요한 이유는 무엇입니까? – netvope

+0

'@ netvope' :'InnoDB'는 색인으로 구성되어 있으며 모든 색인에 행 포인터로 암시 적으로'PRIMARY KEY'를 포함하고 있기 때문입니다. – Quassnoi

3

Django에서 한 번의 쿼리로이 작업을 수행 할 수 없습니다. 이 같은 자신의 가장 최근에 구입 한 단지 날짜으로 고객을 얻을 수 있습니다 :

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

하지만 당신은 자동으로이 방법으로 실제 구매에 액세스 할 수 없습니다.

당신은 유사한 논의를 좀 걸릴 수 있습니다
관련 문제