Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgres递归查询+分组方式+加入Django_Django_Postgresql_Recursion_Sql - Fatal编程技术网

Postgres递归查询+分组方式+加入Django

Postgres递归查询+分组方式+加入Django,django,postgresql,recursion,sql,Django,Postgresql,Recursion,Sql,我的要求是编写一个sql查询,以获取managedobjects发生的按子区域划分的faultevents计数。我的数据库是postgres 8.4。让我解释一下如何使用表结构 我在django的桌子: Managedobject: class Managedobject(models.Model): name = models.CharField(max_length=200, unique=True) iscontainer = mo

我的要求是编写一个sql查询,以获取managedobjects发生的按子区域划分的faultevents计数。我的数据库是postgres 8.4。让我解释一下如何使用表结构

我在django的桌子: Managedobject:

class Managedobject(models.Model):
   name                = models.CharField(max_length=200, unique=True)
   iscontainer         = models.BooleanField(default=False,)
   parentkey           = models.ForeignKey('self', null=True)
事件表:

class Event(models.Model):
    Name        = models.CharField(verbose_name=_('Name'))
    foid        = models.ForeignKey(Managedobject)
Managedobject记录:

NOC
   Chennai
      MO_1
      MO_2
      MO_3
   Mumbai
      MO_4
      MO_5
      MO_6
   Delhi
   Bangalore
IP
   Calcutta
   Cochin
活动记录:

event1 MO_1
event2 MO_2
event3 MO_3
event4 MO_5
event5 MO_6    
现在我需要得到所有子区域的事件计数。比如说,

for NOC region:
  Chennai - 3
  Mumbai - 2
  Delhi - 0
  Bangalore - 0
到目前为止,我能够在两个不同的查询中得到结果

得到次区域

select id from managedobject where iscontainer = True and parentkey = 3489
对于使用For循环的每个区域,按如下方式获取计数:

SELECT count(*) 
from event ev 
WHERE ev.foid 
IN (
    WITH RECURSIVE q AS (
        SELECT h 
        FROM managedobject h 
        WHERE parentkey = 3489 
        UNION ALL 
        SELECT hi 
        FROM q 
        JOIN managedobject hi 
        ON hi.parentkey = (q.h).id 
    ) 
    SELECT (q.h).id FROM q
)
请帮助合并查询,使其成为单个查询并获得前5个区域。由于django中的查询很困难,我将使用原始sql查询。

我得到了以下查询:

WITH RECURSIVE q AS ( 
  SELECT  h, 
          1 AS level, 
          id AS ckey, 
          displayname as dname 
  FROM managedobject h 
  WHERE parentkey = 3489  
    and logicalnode=True 

 UNION ALL 

 SELECT  hi, 
         q.level + 1 AS level, 
         ckey, 
         dname 
 FROM q 
   JOIN managedobject hi ON hi.parentkey = (q.h).id 
) 
SELECT count(ckey) as ccount, 
       ckey, 
       dname 
FROM q 
  JOIN event as ev on ev.foid_id = (q.h).id 
GROUP BY ckey, dname 
ORDER BY ccount DESC 
LIMIT 5

您需要那个iscontainer字段吗?如果parentkey=None,则该对象不是容器;如果Managedobject有parentkey,则该对象是容器?@krieger。谢谢你的努力。在这里,容器有不同的含义。Managedobject表中的父/子关系级别是无限的。如果记录被标记为容器,则它是刚刚添加用于分组的逻辑实体。即使记录mou_1也可以有子mou_11,但它不是一个容器,因为它代表一个物理实体。过一会儿我再看看这个。很抱歉。我以为MO_1是事件,它们只是与事件相关的管理对象。这个表达式是什么:ev.foid_id=q.h.id?这是打字错误吗?不,这是一个正在运行的查询。在Django中,foreignkey字段将附加_id。在postgres递归查询中,您必须以q.h.id的身份访问该字段。我从未见过使用递归CTE的语法。我认为q.id对于内部查询应该足够了。外部可能应该使用q.ckey