【问题标题】:Count nested categories records计算嵌套类别记录
【发布时间】:2017-10-31 17:29:18
【问题描述】:

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

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 视频聊天

这是我的架构的 sqlfiddle:

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

如何在 PostgreSQL 中做到这一点?

【问题讨论】:

  • 我没有得到祖先的“1/2”值——那是怎么回事?..
  • 这是我的 Ruby on Rails 应用程序中的数据库示例。我正在使用祖先宝石:github.com/stefankroes/ancestry
  • 哦 - 我看到它不是分区(1/2 是一半) - 它是路径,所以下一个可能是 1/2/7 等等。也许您还可以提供可读的预期查询结果?...
  • 它应该返回每行都有两列:category_idvideo_chats_count。 @VaoTsun

标签: sql postgresql


【解决方案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)

我的结果与预期不同:

统计类别和其子类别的视频聊天

所以 video chat 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 视频聊天
  • 测试类别子类别 subcategory(3) - 1 视频聊天

【讨论】:

    猜你喜欢
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2018-01-26
    • 2018-09-10
    • 2017-07-08
    • 2021-06-06
    • 2018-04-06
    相关资源
    最近更新 更多