Django 查询中的额外 GROUP BY 子句

Posted

技术标签:

【中文标题】Django 查询中的额外 GROUP BY 子句【英文标题】:Extra GROUP BY clause in django query 【发布时间】:2015-07-28 23:43:26 【问题描述】:

我已经编写了这个 Django ORM 查询:

queryset = Test.objects.all() \
    .annotate_test_date() \ # similar to extract hour 
    .annotate_test_time() \ # similar to extract hour 
    .annotate(hour=Extract(F('created_on'), function='hour')) \
    .annotate(count=Count('id')) \
    .order_by() \
    .values('hour', 'count')

形成的查询结果是:

SELECT extract (hour from ("users_test"."created_on")) AS "hour",
COUNT("users_test"."id") AS "count" 
FROM "users_test" 
GROUP BY "users_test"."id", "users_test"."author_id", "users_test"."created_on", "users_test"."modified_on", "users_test"."access_point_id", "users_test"."user_id", "users_test"."invite_id", "users_test"."building_id", "users_test"."company_id", date("users_test"."created_on"), "time"("users_test"."created_on"), extract (hour from ("users_test"."created_on"))

但所需的查询是:

SELECT extract (hour from ("users_test"."created_on")) AS "hour",
COUNT("users_test"."id") AS "count" 
FROM "users_test" 
GROUP BY extract (hour from ("users_test"."created_on"))

我认为这是由于我的查询中有额外的注释字段,但这些字段是过滤所必需的。

感谢任何帮助。

提前致谢

【问题讨论】:

【参考方案1】:

按此顺序尝试:

queryset = Test.objects.all() \
    .annotate(hour=Extract(F('created_on'), function='hour')) \
    .annotate(count=Count('id')) \
    .values('hour', 'count')
    .order_by()

【讨论】:

django.core.exceptions.FieldError: Cannot resolve keyword 'hour' into field. 甚至不是亲密的伙伴,这将依赖于始终唯一的 id。 我很确定这与此有关:docs.djangoproject.com/en/1.8/topics/db/aggregation/…

以上是关于Django 查询中的额外 GROUP BY 子句的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在具有GROUP BY子句的查询中选择非聚合列,而GROUP BY子句在功能上不依赖于GROUP BY子句中的列?

如何优化执行嵌套在 group-by 子句中的计数的 SQL 查询?

Android 中的 GROUP BY 子句(ICS 及以上)

带有连接和group by子句的选择查询中的MySQL性能问题

如何在没有附加查询的情况下在 SQL Server 中连接没有子查询的 GROUP BY 子句中的字符串?

选择不在 GROUP BY 子句中的列