PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara menghitung baris terkait termasuk subkategori?

Ini berfungsi untuk tunggal tingkat bersarang:

Untuk mencantumkan hanya kategori akar, jumlah termasuk subkategori:

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;

Intinya join di sub_id , tetapi kelompokkan menurut cat_id .

Untuk membuat daftar kategori akar seperti di atas, dan subkategori tambahan :

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 di sini

Untuk jumlah level bersarang yang berubah-ubah, gunakan CTE rekursif. Contoh:

Tentang sintaks pendek opsional 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. Kembalikan baris yang maksimal satu kolom di Postgresql

  2. Membuat file database.yml berfungsi di Rails di OSX

  3. indeks dataframe.to_sql sebagai kunci utama di postgresql

  4. Postgres:Bagaimana cara mengubah string json menjadi teks?

  5. Pesan string varchar sebagai numerik