获取子查询的计数

Posted

技术标签:

【中文标题】获取子查询的计数【英文标题】:get count of a Subquery 【发布时间】:2020-10-04 14:42:58 【问题描述】:

我想用子查询过滤器在我的查询集中注释一个计数字段:

我的代码:

module_attempts = Subquery(
    ModuleProgressAttempt.objects.filter(
        module_progress__module__id=OuterRef("pk")
    ).only("pk")
)
real_instances = VirtualClassRoomModule.objects.filter(
    id__in=[vc.id for vc in vc_clas-s-rooms]
).annotate(
    attendees_count=Count(module_attempts),
)

这里的module_progress__module__id是注解迭代的当前VirtualClassRoomModule的id。计数基本上是 ModuleProgressAttempt 过滤查询集的长度。目前计数始终为 1 ,尽管

ModuleProgressAttempt.objects.filter(
     module_progress__module__id=<Current-module-id>
)

返回多个对象。

【问题讨论】:

【参考方案1】:

这个解决方案对我有用:

module_attempts_count = Subquery(
    ModuleProgressAttempt.objects.filter(module_progress__module__id=OuterRef("id"))
    .values("module_progress__module__id")
    .annotate(cnt=Count("id"))
    .values("cnt")
)
real_instances = VirtualClassRoomModule.objects.filter(
    id__in=[vc.id for vc in vc_clas-s-rooms]
).annotate(
    attendees_count=module_attempts_count,
)

【讨论】:

以上是关于获取子查询的计数的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句汇总(三)——聚合函数分组子查询及组合查询 - Darly

如何在 Gorm 中留下连接子查询计数

获得子查询的计数

mysql查询以获取列中每个元素的计数

哪个最快?计数子查询或分组依据

没有子查询的 MySQL 显示计数