【问题标题】:django, count and sum querydjango,计数和求和查询
【发布时间】:2016-03-23 14:45:07
【问题描述】:

用户可以创建邀请。

其他用户可以接受邀请。

我想统计每个邀请者 (user_invite) 的接受用户总数

邀请函 id, user_invite ----------------- 1、一 2、一个 3、一个 4、乙 5、乙 邀请接受 邀请,用户接受 ----------------- 1、丙 1、d 2、电子 4、f

我想要

user_invite,accept_count ---------------------------- 一个 3 (c,d,e) b 1(f)

Django orm 看起来像

class Invitation:
    user_invite = models.ForeigneKey(settings.AUTH_USER_MODEL)
    invite_at = models.DateTimeField()
    accepts = generic.GenericRelation(InvitationAccept)

class InvitationAccept:

    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    invitation = generic.GenericForeignKey('content_type', 'object_id')

    user_accept = models.ForeignKey(settings.AUTH_USER_MODEL)

这样做的 orm 方式是什么?和sql等效?

【问题讨论】:

    标签: sql django orm django-queryset


    【解决方案1】:

    我不知道你使用的是什么数据库,所以我在 MS SQL-SERVER 中尝试了这个

        select a.user_invite,cast(COUNT(1) as varchar) + '(' + ' ' +
        (STUFF((select ',' + user_accept from (select * from Invitation inv inner join InvitationAccept apct on inv.id = apct.invitation) b
        where b.user_invite=a.user_invite FOR XML PATH('')),1,1,'')) + ' ' + ')' as accept_count
        from (select * from Invitation inv inner join InvitationAccept apct on inv.id = apct.invitation) a
        group by a.user_invite
    

    如果您使用的是 Oracle,请尝试使用其他函数,可能是 concat_ws() 来替换内容部分和 ||替换 +。

    【讨论】:

      【解决方案2】:

      如果您使用MySQL,您可以使用GROUP_CONCATLEFT OUTER JOIN 返回0 () 以获得不匹配的邀请:

      SELECT i.user_invite,
         CONCAT(COUNT(ia.invitation), ' (',
                GROUP_CONCAT(user_accept ORDER BY user_accept),')') AS accept_count
      FROM Invitation i
      LEFT JOIN InvitationAccept ia
        ON i.id = ia.invitation
      GROUP BY i.user_invite;
      

      SqlFiddleDemo

      输出:

      ╔══════════════╦══════════════╗
      ║ user_invite  ║ accept_count ║
      ╠══════════════╬══════════════╣
      ║ a            ║ 3 (c,d,e)    ║
      ║ b            ║ 1 (f)        ║
      ╚══════════════╩══════════════╝
      

      编辑:

      其实我只需要计数,(c,d,e) 只是为了解释。

      现在代码可移植且兼容 ANSI。它适用于大多数 RBDMS。

      SELECT i.user_invite, COUNT(ia.invitation) AS accept_count
      FROM Invitation i
      LEFT JOIN InvitationAccept ia
        ON i.id = ia.invitation
      GROUP BY i.user_invite;
      

      【讨论】:

      • 哦,谢谢,其实我只需要计数,(c,d,e) 只是为了解释。
      猜你喜欢
      • 1970-01-01
      • 2011-01-29
      • 2011-09-01
      • 2023-03-31
      • 2015-02-09
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多