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. Oracleデータベースにファイルを挿入する方法は?

    2. postgresqlで実行中のクエリの実行プランを取得するにはどうすればよいですか?

    3. SQLServer2008の一意のキーと一意のインデックス

    4. MySQLファイアアンドフォーゲットINSERT/UPDATE / DELETE-mysql_unbuffered_queryの使用をお勧めしますか?