PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да преброим свързани редове, включително подкатегории?

Това върши работа за единичен ниво на влагане:

За да изброите само основните категории, броят включва подкатегории:

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 :



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вземете името на месеца от числото в PostgreSQL

  2. Postgresql k-най-близък съсед (KNN) на многомерен куб

  3. Кой има документи за фоновите процеси на PostgreSQL?

  4. Не може да се инсталира plpython3u - postgresql

  5. Има ли функция, която отнема година, месец и ден, за да създаде дата в PostgreSQL?