Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django自引用嵌套查询集_Django_Django Models_Django Orm - Fatal编程技术网

Django自引用嵌套查询集

Django自引用嵌套查询集,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 ) 本例中的警报表是所有可能发生的警报的历史记录,每个警报上都有一个类别标记,查询返回每个类别的最新警报。看起来没有办法将查询

如何使用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
)

本例中的警报表是所有可能发生的警报的历史记录,每个警报上都有一个类别标记,查询返回每个类别的最新警报。

看起来没有办法将查询直接转换为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