【发布时间】:2021-12-04 12:37:50
【问题描述】:
我有一个ecosystems 表,它是自引用的,因为每个生态系统都可以有子生态系统。每个生态系统也可以有一个分数(代表生态系统的健康程度)。这些列是(带有示例数据):
| slug | parent_slug | full_slug | score |
| ---- | ----------- | ----------- | ----- |
| aaa | null | aaa | 1 |
| bbb | aaa | aaa/bbb | 2 |
| ccc | bbb | aaa/bbb/ccc | 4 |
| ddd | null | ddd | 8 |
| eee | ddd | ddd/eee | 16 |
| fff | null | fff | 32 |
full_slug 列代表从顶级生态系统向下的完整路径。它是多余的,因为它可以从 slug 和 parent_slug 列中推断出来,但它就在那里。
我想要实现的是创建一个行数相同的查询,但有一列 total_score 以递归方式计算每个生态系统的分数加上其所有子生态系统的分数。也就是说,输出应该是:
| slug | total_score |
| ---- | ----------- |
| aaa | 7 |
| bbb | 6 |
| ccc | 4 |
| ddd | 24 |
| eee | 16 |
| fff | 32 |
我开始了以下查询:
WITH top AS (
SELECT
SUM(e.score) as total_score,
CASE instr(e.full_slug, '/') WHEN 0 THEN
e.full_slug
ELSE
substr(e.full_slug, 0, instr(e.full_slug, '/'))
END AS top_level_eco
FROM ecosystems e
GROUP BY top_level_eco
)
SELECT
e.slug,
top.total_score
FROM ecosystems e
INNER JOIN top on top.top_level_eco = e.slug;
但不幸的是,它只显示了顶级生态系统及其总分。
【问题讨论】:
-
蛞蝓可以包含
/吗?是否有最大深度(full_slug中/的最大数量)? -
Slugs 只能是字母数字(这就是为什么选择
/作为分隔符)。没有最大的生态系统深度。