10

(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 purchases. Each purchase belongs to one customer. I want to get a list of all customers along with their last purchase. Can it be done without raw SQL and without multiple database queries?

Community
  • 1
  • 1
netvope
  • 7,647
  • 7
  • 32
  • 42
  • possible duplicate of [Django Query That Get Most Recent Objects From Different Categories](http://stackoverflow.com/questions/2074514/django-query-that-get-most-recent-objects-from-different-categories) – dbn Jun 27 '14 at 22:07

3 Answers3

3

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.

Daniel Roseman
  • 588,541
  • 66
  • 880
  • 895
2

You can take a look at similar discussion:

Django Query That Get Most Recent Objects From Different Categories

Community
  • 1
  • 1
Tomasz Zieliński
  • 16,136
  • 7
  • 59
  • 83
0
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.

Quassnoi
  • 413,100
  • 91
  • 616
  • 614