PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak liczyć powiązane wiersze, w tym podkategorie?

To działa dla singla poziom zagnieżdżenia:

Aby wyświetlić tylko kategorie główne, liczby obejmują podkategorie:

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;

Chodzi o to, aby dołączyć na sub_id , ale pogrupuj według cat_id .

Aby wyświetlić główne kategorie, takie jak powyżej, i podkategorie dodatkowo :

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 tutaj

Dla dowolnej liczby poziomów zagnieżdżenia użyj rekurencyjnego CTE. Przykład:

Informacje o opcjonalnej krótkiej składni 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. Nie znaleziono obrazu Psycopg2

  2. Jak używać funkcji podciągów w PostgreSQL i Redshift

  3. Błąd Postgres bytea podczas wiązania wartości null z przygotowanymi instrukcjami

  4. Wybierz pierwszy rekord, jeśli żaden nie pasuje

  5. Zapytanie o zakres czasu, ignorując datę znaczników czasu