Как можно выполнить запрос «наибольший по группе» в django? - PullRequest
8 голосов
/ 21 января 2010

(Это версия потока в django на Соединение SQL: выбор последних записей в отношении один ко многим )

Предположим, у меня есть таблица клиентов и таблица покупок. Каждая покупка принадлежит одному клиенту. Я хочу получить список всех клиентов вместе с их последней покупкой. Можно ли это сделать без необработанного SQL и без нескольких запросов к базе данных?

Ответы [ 3 ]

3 голосов
/ 21 января 2010

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

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

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

2 голосов
/ 22 января 2010
1 голос
/ 21 января 2010
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.

...