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

问题描述

|| 我的要求是编写一个SQL查询,以获取针对托管对象发生的分区明智(故障)事件计数。我的数据库是postgres 8.4。让我解释一下表结构。 我在Django中的表格: 被管理对象:
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)
被管理对象记录:
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,dname 
FROM q 
  JOIN event as ev on ev.foid_id = (q.h).id 
GROUP BY ckey,dname 
ORDER BY ccount DESC 
LIMIT 5