Sql 统计嵌套类别记录

Sql 统计嵌套类别记录,sql,postgresql,Sql,Postgresql,我的数据库中有以下架构: 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

我的数据库中有以下架构:

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
);
我有一些视频聊天的嵌套类别:

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'); 
现在,我想使用sql查询来统计类别及其子类别的视频聊天。它应该返回以下结果:

  • 测试类别-2视频聊天
  • 测试类别子类别-1视频聊天
  • 测试类别子类别子类别-1视频聊天
以下是SQLFIDLE与我的模式:

如何在PostgreSQL中执行此操作

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属于类别3,因此属于类别2,因此属于类别1,因此vc2类别: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)-2视频聊天
  • 测试类别子类别子类别(3)-1视频聊天

我没有得到祖先中的'1/2'值-这是怎么回事?。这是我的Ruby on Rails应用程序中的数据库示例。我使用的是祖先宝石:哦-我看到它没有分割(1/2是一半)-这是路径,因此下一个可能是
1/2/7
等等。也许您还可以提供可读的预期查询结果。它应该返回行,其中每个行都有两列:
category\u id
video\u chats\u count
@VaoTsun