यह एक एकल . के लिए काम करता है नेस्टिंग का स्तर:
केवल मूल श्रेणियों को सूचीबद्ध करने के लिए, गणना में उपश्रेणियाँ शामिल हैं:
WITH root AS (
SELECT id AS cat_id, id AS sub_id
FROM category
WHERE is_base_template = false
AND "userId" = 1
)
SELECT c.cat_id, count(*)::int AS entries_in_cat
FROM (
TABLE root
UNION ALL
SELECT r.cat_id, c.id
FROM root r
JOIN category c ON c."parentCategoryId" = r.cat_id
) c
JOIN category_entries_entry e ON e."categoryId" = c.sub_id
GROUP BY c.cat_id;
बात यह है कि sub_id
. पर शामिल हों , लेकिन समूह द्वारा cat_id
।
उपरोक्त और उपश्रेणियों की तरह मूल श्रेणियों को सूचीबद्ध करने के लिए इसके अतिरिक्त :
WITH root AS (
SELECT id AS cat_id, id AS sub_id
FROM category
WHERE is_base_template = false
AND "userId" = 1
)
, ct AS (
SELECT c.cat_id, c.sub_id, count(*)::int AS ct
FROM (
TABLE root
UNION ALL
SELECT r.cat_id, c.id AS sub_id
FROM root r
JOIN category c ON c."parentCategoryId" = r.cat_id
) c
JOIN category_entries_entry e ON e."categoryId" = c.sub_id
GROUP BY c.cat_id, c.sub_id
)
SELECT cat_id, sum(ct)::int AS entries_in_cat
FROM ct
GROUP BY 1
UNION ALL
SELECT sub_id, ct
FROM ct
WHERE cat_id <> sub_id;
db<>fiddle यहां
नेस्टिंग स्तरों की मनमानी संख्या के लिए, एक पुनरावर्ती CTE का उपयोग करें। उदाहरण:
वैकल्पिक शॉर्ट सिंटैक्स के बारे में TABLE parent
: