有两个关键字:一是等级,我用 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 闭包表设计
越写越复杂,不知道哪位有一些好的方法。
1
liprais 2017-08-10 20:16:50 +08:00 via iPhone
mysql 纯写 sql 不行
pg 有 recurisive cte 应该可以 |
2
weizhiyao008 2017-08-10 21:26:58 +08:00
sql server 可以使用 with as,本质应该就是递归
|
3
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; |
4
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%'; |