如何在django中进行“最大n组”查询?

时间:2010-01-21 17:57:52

标签: sql django join greatest-n-per-group

(这是SQL join: selecting the last records in a one-to-many relationship的线程的django版本)

假设我有一张顾客表和一张购买表。每次购买都属于一个客户。我想获得所有客户的清单以及他们上次购买的情况。可以在没有原始SQL且没有多个数据库查询的情况下完成吗?

3 个答案:

答案 0 :(得分:3)

你不能在Django的一个查询中执行此操作。您可以通过最近一次购买的日期来获取客户:

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

但您不会以这种方式自动获得实际购买的访问权限。

答案 1 :(得分:2)

答案 2 :(得分: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上有综合索引。