Django自引用嵌套查询集
如何使用Django ORM表示这个简单的SQLDjango自引用嵌套查询集,django,django-models,django-orm,Django,Django Models,Django Orm,如何使用Django ORM表示这个简单的SQL SELECT * FROM alerts a1 WHERE timestamp = ( SELECT MAX(timestamp) FROM alerts a2 WHERE a1.category = a2.category AND a1.type = a2.type ) 本例中的警报表是所有可能发生的警报的历史记录,每个警报上都有一个类别标记,查询返回每个类别的最新警报。看起来没有办法将查询
SELECT * FROM alerts a1 WHERE timestamp = (
SELECT MAX(timestamp) FROM alerts a2
WHERE a1.category = a2.category
AND a1.type = a2.type
)
本例中的警报表是所有可能发生的警报的历史记录,每个警报上都有一个类别标记,查询返回每个类别的最新警报。看起来没有办法将查询直接转换为django orm。您将需要使用原始查询,或搜索其他解决方案 这里有一个可能的命题: 我假设pk就像时间戳一样,创建的越晚-越高。所以我按类别和类型对col进行分组,然后选择MAX'pk'而不是MAX'timestamp'
latest_events_pks = Event.objects.values('category', 'typ') \
.annotate(max=Max('pk')) \
.values_list('max', flat=True)
它生成如下查询:
SELECT MAX("event"."id") AS "max" FROM "event"
GROUP BY "event"."category", "event"."typ"
返回id列表,例如:[1、15、20、22]。因此,可以选择适当的事件:
Event.objects.filter(id__in=latest_events_pks)
这是两个查询,但它们应该比带有子查询的查询更有效。看起来没有办法将查询直接转换为django orm。您将需要使用原始查询,或搜索其他解决方案 这里有一个可能的命题: 我假设pk就像时间戳一样,创建的越晚-越高。所以我按类别和类型对col进行分组,然后选择MAX'pk'而不是MAX'timestamp'
latest_events_pks = Event.objects.values('category', 'typ') \
.annotate(max=Max('pk')) \
.values_list('max', flat=True)
它生成如下查询:
SELECT MAX("event"."id") AS "max" FROM "event"
GROUP BY "event"."category", "event"."typ"
返回id列表,例如:[1、15、20、22]。因此,可以选择适当的事件:
Event.objects.filter(id__in=latest_events_pks)
这是两个查询,但它们应该比带有子查询的查询更有效。使用pk的好主意。它实际上只执行一个带有嵌套select的查询。内部选择是分组类别和类型的聚合,这正是我在OP中要求的。选择*FROM alerts WHERE id IN SELECT MAXU0.id AS maxid FROM alerts U0 GROUP BY U0.category,U0.subtype关于使用pk的好主意。它实际上只使用嵌套的SELECT执行一个查询。内部选择是分组类别和类型的聚合,这正是我在OP中要求的。从警报中选择*按U0.category、U0.subtype从警报U0组中选择MAXU0.id作为maxid