sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur räknar man relaterade rader inklusive underkategorier?

Detta gör jobbet för en singel nivå av kapsling:

För att bara lista rotkategorier inkluderar räkningarna underkategorier:

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;

Poängen är att gå med på sub_id , men gruppera efter cat_id .

För att lista rotkategorier som ovan, och underkategorier ytterligare :

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<>fiol här

För ett godtyckligt antal kapslingsnivåer, använd en rekursiv CTE. Exempel:

Om den valfria korta syntaxen TABLE parent :



  1. sql-fråga för att ersätta city pune till mumbai och mumbai till pune i tabellen

  2. Hur ansluter jag XAMPP MySQL lokal DB med JDBC?

  3. MySql-minnesmotorn kontrollerar inte uppdatera främmande nyckel?

  4. Hur genererar man flera tidsserier i en sql-fråga?