【问题标题】:Counting and ordering entities over multiple relations对多个关系的实体进行计数和排序
【发布时间】:2013-07-27 11:18:45
【问题描述】:

我有三个表之间的关系;

Customer --> Order --> OrderLine

我想知道哪些客户下订单的订单行最多。使用纯 SQL,我将继续使用以下查询;

SELECT a.*, COUNT( c.id ) AS total FROM customer AS a
 LEFT JOIN order AS b ON a.id = b.customer_id
 LEFT JOIN order_line AS c ON b.id = c.order_id
 GROUP BY a.id ORDER BY total DESC;

我看到另一个问题here,我怀疑这可能是我的问题的解决方案,但我无法真正理解解决多个关系的答案。

【问题讨论】:

    标签: django django-orm


    【解决方案1】:

    这将为您提供每位客户的最大订单行数:

    from django.db.models import Max
    custs = Customer.objects.annotate(max_order_lines=Max(order__orderline)).values('id', 'max_order_lines').order_by('-max_order_lines')
    max_cust = custs[0]
    

    【讨论】:

    • 我很抱歉不清楚,不幸的是关系不是多对多而是一对多,(即一个客户有很多订单,一个订单有很多订单)。这会使事情复杂化吗?
    • @Rayne ForeignKey 的反面是 RelatedManager,其工作方式几乎与 ManyRelatedManager 完全相同,您将获得 ManyToManyField。所以它绝对应该工作而不会使事情复杂化。 @Neil 您可以使用 .order_by('-max_order_lines') 而不是使用排序的字典和所有内容。然后只需使用custs.first() 即可获得第一行。
    • @knbk 谢谢!我已经编辑了我的回复以说明你所有的 cmets。 Rayne,这应该可以,如果可以,请接受答案:)
    • @Neil 刚刚尝试在我自己的项目中使用.first() 方法,然后注意到在我们获得 Django 1.6 之前它不可用。我们现在必须坚持使用[0]
    • @knbk 谢谢,我已经改回来了。我之前没见过first(),但很高兴知道:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多