PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm thế nào để đếm các hàng liên quan bao gồm các danh mục con?

Điều này thực hiện công việc cho một đơn mức độ làm tổ:

Để chỉ liệt kê các danh mục gốc, số lượng bao gồm các danh mục phụ:

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;

Vấn đề là tham gia trên sub_id , nhưng nhóm theo cat_id .

Để liệt kê các danh mục gốc như trên và các danh mục phụ bổ sung :

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 tại đây

Đối với một số cấp độ lồng nhau tùy ý, hãy sử dụng CTE đệ quy. Ví dụ:

Giới thiệu về cú pháp ngắn tùy chọn 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. Đổi tên nhiều cột trong một câu lệnh với PostgreSQL

  2. Gọi thủ tục SQL được lưu trữ Postgres Từ Django

  3. Django và PostgreSQL - giá trị quá dài đối với ký tự loại thay đổi (512)

  4. cách chọn tất cả các bản ghi có chứa các giá trị nhất định từ một trường postgres json chứa một mảng

  5. Lỗi postgres bytea khi liên kết null với các câu lệnh đã chuẩn bị