Как “greatest-n-per-group” может запросить в django?

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

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

8
задан Community 23 May 2017 в 10:27
поделиться

3 ответа

2
ответ дан 5 December 2019 в 22:18
поделиться
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 , или на покупок (клиент, дата, ID) Если ваш стол MyISAM .

1
ответ дан 5 December 2019 в 22:18
поделиться

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

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

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

3
ответ дан 5 December 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: