2010-01-21 2 views
8

(Это версия версии django на SQL join: selecting the last records in a one-to-many relationship)Как выполнить запрос «наибольшая n-на-группу» в django?

Предположим, у меня есть таблица клиентов и таблица покупок. Каждая покупка принадлежит одному клиенту. Я хочу получить список всех клиентов вместе со своей последней покупкой. Можно ли это сделать без необработанного 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 
     ) 

Убедитесь, что составной индекс на purchases (customer, date), если ваша таблица InnoDB, или на purchases (customer, date, id), если ваша таблица MyISAM.

+0

Почему нам не нужен id в индексе для InnoDB? – netvope

+0

'@ netvope': потому что' InnoDB' является индексированным и неявно содержит «PRIMARY KEY» в качестве указателя строки в каждом индексе. – Quassnoi

3

Вы не можете сделать это в одном запросе в Django. Вы можете получить клиента только с даты их последней покупки, как это:

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

но вы не автоматически получаете доступ к фактической покупки таким образом.