【问题标题】:django create count subquery without groupbydjango 创建没有 groupby 的计数子查询
【发布时间】:2020-01-12 06:29:22
【问题描述】:

我想使用可用作子查询的查询。但我注意到这样的查询:

x = Deal.all_objects.filter(state='created').values('id').annotate(cnt=Count('id')).values('cnt')

生产

SELECT COUNT("deals_deal"."id") AS "cnt" 
FROM "deals_deal" 
WHERE "deals_deal"."state" = created 
GROUP BY "deals_deal"."id"

我不需要GROUP BY,我只想计算匹配过滤器的报价。

我不想使用.count(),因为它不允许我编写这样的查询:

Deal.all_objects.filter(
            Q(creator=OuterRef('pk')) | Q(taker=OuterRef('pk'), state='completed')
        ).annotate(cnt=Count('pk')).values('cnt')

如何修改上述查询,使其在没有GROUP BY 的情况下计数?

【问题讨论】:

  • annotate(cnt=Count('id')) 应该做什么?这始终为 1,因为您正在计算行本身的列。

标签: sql django django-queryset


【解决方案1】:

您正在寻找的是聚合而不是注释。

x = Deal.objects.filter(state='created').values('id').aggregate(cnt=Count('id'))
# x is a dictionary {"cnt":9000}, you wouldn't even need the ".values('id')" now

这将导致类似这样的查询

SELECT COUNT("deals_deal"."id") AS "cnt" 
FROM "deals_deal" 
WHERE "deals_deal"."state" = created

您可以使用Aggregate 做更多很酷的事情

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 2019-05-11
    • 2021-09-03
    • 2012-08-22
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多