[英]Postgres Recursive query + group by + join in Django
我的要求是編寫一個SQL查詢,以獲取針對托管對象發生的子區域明智(故障)事件計數。 我的數據庫是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)
被管理對象記錄:
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 = (qh).id ) SELECT (qh).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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.