【发布时间】:2011-01-07 20:51:57
【问题描述】:
(这是SQL join: selecting the last records in a one-to-many relationship的线程的django版本)
假设我有一张客户表和一张采购表。每次购买都属于一位客户。我想获得所有客户的列表以及他们最后一次购买。可以在没有原始 SQL 和多个数据库查询的情况下完成吗?
【问题讨论】:
标签: sql django join greatest-n-per-group
(这是SQL join: selecting the last records in a one-to-many relationship的线程的django版本)
假设我有一张客户表和一张采购表。每次购买都属于一位客户。我想获得所有客户的列表以及他们最后一次购买。可以在没有原始 SQL 和多个数据库查询的情况下完成吗?
【问题讨论】:
标签: sql django join greatest-n-per-group
您不能在 Django 中的一个查询中执行此操作。您可以通过客户最近一次购买的日期来获取客户,如下所示:
from django.db.models import Max
customers = Customer.objects.annotate(Max('purchase__date'))
但您不会通过这种方式自动获得实际购买的权限。
【讨论】:
【讨论】:
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,请确保您在purchases (customer, date) 上有一个复合索引,如果您的表是MyISAM,请确保在purchases (customer, date, id) 上有一个复合索引。
【讨论】:
@netvope:因为InnoDB 是索引组织的,并且在每个索引中隐式包含PRIMARY KEY 作为行指针。