gpt4 book ai didi

sql - 计算嵌套类别记录

转载 作者:行者123 更新时间:2023-11-29 13:17:25 26 4
gpt4 key购买 nike

我的数据库中有以下模式:

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 中执行此操作?

最佳答案

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)

我的结果与预期不同:

counts video chats for category and its sub categories

所以 video chat id 1 属于类别 2 因此(因为 2 是 1 到 1 的子类别,所以它是 vc1 categories: 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 subcategory(3) - 1 次视频聊天

关于sql - 计算嵌套类别记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47041247/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com