【问题标题】:Django query aggregationDjango 查询聚合
【发布时间】:2012-04-01 19:46:28
【问题描述】:

想象一个数字猜谜游戏,一个人想到一个数字,另一个人必须猜它。如果猜对了,游戏就结束了。

模型可能看起来像这样

class SecretNumber(models.Model):
    number = models.IntegerField()

class Guess(models.Model)
    secretnumber = models.Foreignkey(SecretNumber)
    guess = models.IntegerField()

玩了四次后,数据库可能是这样的:

id  number  
==========
1   10
2   54
3   68
4   25

id  secretnumber_id     guess
=============================
1   1                   50
2   1                   30
3   1                   10
4   2                   99
5   2                   60
6   2                   54
7   3                   1
8   3                   68
9   4                   73
10  4                   34
11  4                   86
12  4                   51
13  4                   25

如您所见,猜者非常幸运:他猜了 3、3、2 和 4 次。但这只是为了让这个例子简短。 现在我需要提出一个允许显示以下数据的查询:

Nb. guesses     Count   
=====================
2               1
3               2
4               1

手动 SQL 语句如下所示:

SELECT inner_count AS 'Nb. guesses', count(inner_count) AS 'Count' FROM (
  SELECT secretnumber_id, count(id) AS inner_count FROM guess GROUP BY secretnumber_id
) GROUP BY inner_count

我考虑过注释注释,但这似乎是不可能的。 有什么想法吗?

【问题讨论】:

    标签: django aggregation


    【解决方案1】:

    如果您使用的是 django(即模型而不是类),您想使用 QuerySet aggregate functions

    例如

    from django.db.models import Count
    guesses = Guess.objects.values('secretnumber').annotate(Count('secretnumber'))
    

    这将为您提供一个包含对象列表的查询集,其中包含一个秘密编号和一个计数值。

    【讨论】:

    • 是的,我正在使用 Django 和它的模型。您是否同意您的查询将注释每个秘密数字的猜测次数?像这样:` [ {'secretnumber__count': 3, 'secretnumber': 1}, {'secretnumber__count': 3, 'secretnumber': 2}, {'secretnumber__count': 2, 'secretnumber': 3}, {'secretnumber__count ': 4, 'secretnumber': 4}, ] ` 我需要更进一步并汇总这个结果,这样我才能知道有多少游戏被 1 次猜测、2 次猜测、...、n 次猜测解决了。
    • 啊,对不起,我误解了这个问题。我无法测试,但您能否在末尾添加第二个聚合:guess = Guess.objects.values('secretnumber').annotate(Count('secretnumber')).values('secretnumber__count').annotate(计数('secretnumber__count'))
    • 查询抛出错误... FieldError: Cannot resolve keyword 'count' into field.
    • guesses = Guess.objects.values('secretnumber').annotate(secretnumber_count=Count('secretnumber')).values('sec‌​retnumber_count').annotate(Count('secretnumber_count') )
    • 在这种情况下,我认为唯一的解决方案是通过 extra() 函数显式添加 SQL:docs.djangoproject.com/en/dev/ref/models/querysets/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2011-09-01
    • 2017-07-21
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多