一个 SQL 等级业务分析。

2017-08-10 20:12:38 +08:00
 ebony0319

有两个关键字:一是等级,我用 G 表示,父节点,我用 P 表示。

现在需要做一个查询,选择该节点下所有一级子节点(比如 A 下面就是 B,E;)和在该节点下(这个很重要)所有一级子节等级相同的所有结果。

比如在 A 结果下查找:结果应该是 B,C,D,E。

在 B 下查找结果应该是 C 和 D 但是没有 E。

比如 A 下第一级子节点:

select * from table where P='A';

查找与 A 一级子节点等级相同的结果,这里假如知道是 1 ;

select * from table where G=1;

这样两个结果集何在一起但是不能在该节点下,不知道怎么做减法。

一些思路:1 递归,2 闭包表设计

越写越复杂,不知道哪位有一些好的方法。

3866 次点击
所在节点    MySQL
4 条回复
liprais
2017-08-10 20:16:50 +08:00
mysql 纯写 sql 不行
pg 有 recurisive cte 应该可以
weizhiyao008
2017-08-10 21:26:58 +08:00
sql server 可以使用 with as,本质应该就是递归
CRVV
2017-08-11 10:48:20 +08:00
PostgreSQL

CREATE TABLE tree (
id TEXT PRIMARY KEY,
parent TEXT REFERENCES tree(id),
grade int
);

INSERT INTO tree (id, parent, grade) VALUES
('A', NULL, 0),
('B', 'A', 1),
('C', 'B', 1),
('D', 'B', 1),
('E', 'A', 1),
('F', 'E', 2),
('G', 'B', 2);

WITH RECURSIVE subquery AS (
SELECT children.id, children.grade FROM tree AS parent
INNER JOIN tree AS children ON children.parent = parent.id WHERE parent.id = 'A'
UNION
SELECT children.id, parent.grade FROM subquery AS parent
INNER JOIN tree AS children ON parent.id = children.parent AND parent.grade = children.grade
)
SELECT * FROM subquery;
resturlaub
2017-08-11 13:46:36 +08:00
加个字段
A /A
B /A/B
C /A/B/C
D /A/B/D
E /A/E
F /A/F


select * from <table> where <new_field> like '/A%';
select * from <table> where <new_field> like '/A/B%';
select * from <table> where <new_field> like '/A/E%';

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/382023

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX