Django ORM 查询 GROUP BY 由 MAX 组合的多个列
Posted
技术标签:
【中文标题】Django ORM 查询 GROUP BY 由 MAX 组合的多个列【英文标题】:Django ORM query GROUP BY multiple columns combined by MAX 【发布时间】:2013-03-23 18:07:37 【问题描述】:我正在将 Django 与 mysql 一起使用。我有一个类似于以下的模型:
class MM(models.Model):
a = models.IntegerField()
b = models.IntegerField()
c = models.DateTimeField(auto_now_add=True)
我有多个行,a
等于 b
,我想执行以下 SQL 查询:
SELECT a, b, MAX(c) AS max FROM MM GROUP BY b, a;
如何使用 Django ORM 完成此操作?我已经尝试过使用注释的不同方法,但现在运气不错。
非常感谢!
【问题讨论】:
【参考方案1】:我认为你可以这样做:
MM.objects.all().values('b', 'a').annotate(max=Max('c'))
注意,你需要导入一些东西才能使用 Max:from django.db.models import Max
values('b', 'a')
将给出 GROUP BY b, a
,annotate(...)
将计算查询中的 MAX。
【讨论】:
仅供参考,all()
是多余的,不是必需的。
只是为了形式化,这里是documentation link“...原始结果根据 values() 子句中指定的字段的唯一组合进行分组。”【参考方案2】:
你也可以试试这个
from django.db.models import Max
mm_list=MM.objects.all().values('b','a').annotate(max=Max('c'))
for mm in mm_list:
a=mm['a']
b=mm['b']
max=mm['max']
【讨论】:
【参考方案3】:用两个字段对字段组求和。
from django.db.models import Sum
SQL
select caja_tipo_id, tipo_movimiento, sum(monto) from config_caja group by caja_tipo_id, tipo_movimiento
姜戈
objs = Caja.objects.values('caja_tipo__nombre','tipo_movimiento').order_by().annotate(total=Sum('monto'))
【讨论】:
以上是关于Django ORM 查询 GROUP BY 由 MAX 组合的多个列的主要内容,如果未能解决你的问题,请参考以下文章
Django ORM在注释多个聚合列时删除不需要的Group by
Django Average 和 Group By 中的 MYSQL 等效查询