2017-10-31 12 views
1

を記録:カウントネストされたカテゴリ、私は私のデータベースで次のスキーマ持っ

CREATE TABLE categories (
    id bigint NOT NULL, 
    name character varying NOT NULL, 
    ancestry character varying 
); 

CREATE TABLE video_chats (
    id bigint NOT NULL, 
    name character varying NOT NULL, 
    category_id bigint NOT NULL 
); 

を、私はビデオチャットでいくつかのネストされたカテゴリいる:今、私はビデオをカウントし、SQLクエリを持っている

INSERT INTO categories (id, name, ancestry) 
    VALUES (1, 'Test category', null); 

INSERT INTO categories (id, name, ancestry) 
    VALUES (2, 'Test category subcategory', '1');  

INSERT INTO categories (id, name, ancestry) 
    VALUES (3, 'Test category subcategory', '1/2'); 

INSERT INTO video_chats (id, name, category_id) 
    VALUES (1, 'Test Video 1', '2');  

INSERT INTO video_chats (id, name, category_id) 
    VALUES (2, 'Test Video 2', '3'); 

をしたいですカテゴリとそのサブカテゴリのチャットそれは次のような結果を返す必要があります:

  • テストカテゴリ - 2ビデオ
  • テストカテゴリのサブカテゴリをおしゃべり - 1ビデオ
  • テストカテゴリのサブカテゴリサブカテゴリチャット - ここで1ビデオチャット

はとsqlfiddleです私のスキーマ:どのように

http://sqlfiddle.com/#!17/f1cee/2

PostgreSQLでこれを行うことはできますか?

+1

私は祖先で '1/2'の値を取得しません - それはどうですか? –

+0

これは私のRuby on Railsアプリケーションのデータベースの例です。私は祖先の宝石を使用しています:https://github.com/stefankroes/ancestry –

+1

オハイオ州 - 私はそのデビジョンを見ません(1/2は半分です) - それは経路なので、次は1/2/7です等々。たぶん、読み込み可能な期待されたクエリの結果を提供することもできますか? –

答えて

1
t=# with a as (select v.id,unnest(array_append(string_to_array(ancestry,'/')::bigint[],c.id)) cg from video_chats v join categories c on v.category_id = c.id) 
select cg,count(1) from a group by cg order by cg; 
cg | count 
----+------- 
    1 |  2 
    2 |  2 
    3 |  1 
(3 rows) 

私の結果は予想とは異なります。

カウントビデオカテゴリのチャットやそのサブカテゴリー

をのでビデオチャットID 1がカテゴリ2に属し、したがって、( 2は1対1のサブカテゴリであるため、vc1カテゴリです:2,1 ビデオチャット2 VC2のcateroriesので、1から2ひいてはすることは、カテゴリ3に属し、そして:私のクエリで3,2,1

それはCTE体である:

:に結果

t=# select v.id,array_append(string_to_array(ancestry,'/')::bigint[],c.id) from video_chats v join categories c on v.category_id = c.id;  id | array_append 
----+-------------- 
    1 | {1,2} 
    2 | {1,2,3} 
(2 rows) 

ので、

  • テストカテゴリ(1) - 2ビデオ
  • テストカテゴリのサブカテゴリをチャットを(1) - 1ビデオチャット
  • から2ビデオ
  • テストカテゴリのサブカテゴリサブカテゴリ(3)チャット
関連する問題