How can a do a “greatest-n-per-group” query in django?

后端 未结 3 1807
有刺的猬
有刺的猬 2020-12-17 22:20

(This is the django version of the thread at SQL join: selecting the last records in a one-to-many relationship)

Suppose I have a table of customers and a table of p

相关标签:
3条回答
  • 2020-12-17 23:12
    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
            )
    

    Make sure you have a composite index on purchases (customer, date) if your table is InnoDB, or on purchases (customer, date, id) if your table is MyISAM.

    0 讨论(0)
  • 2020-12-17 23:21

    You can take a look at similar discussion:

    Django Query That Get Most Recent Objects From Different Categories

    0 讨论(0)
  • 2020-12-17 23:24

    You can't do this in one query in Django. You can get the customer with just the date of their most recent purchase like this:

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

    but you don't automatically get access to the actual purchase this way.

    0 讨论(0)
提交回复
热议问题