mysql树形结构筛选
mysql版本:5.7
有如下结构:
CREATE TABLE tb_tree (
id INT NOT NULL PRIMARY KEY,
pid INT not null default 0,
full_path VARCHAR(255) NULL,
FOREIGN KEY (pid) REFERENCES tb_tree(id)
);
id:主键ID
pid:树形结构,标识当前行的父节点ID
full_path:当前行在树形结构中的路径,例如当前id为10,父节点为9,那么他的full_path为:9-10
例如在经过某一轮筛选后,有如下数据,或者说某个账号只能看到如下数据
注意ID为100的数据,它的父节点99是存在的,只是业务逻辑中无法得到该节点的数据
INSERT INTO tb_tree (id, pid, full_path) VALUES (1, 0, '1');
INSERT INTO tb_tree (id, pid, full_path) VALUES (2, 1, '1-2');
INSERT INTO tb_tree (id, pid, full_path) VALUES (3, 2, '1-2-3');
INSERT INTO tb_tree (id, pid, full_path) VALUES (4, 3, '1-2-3-4');
INSERT INTO tb_tree (id, pid, full_path) VALUES (100, 99, '99-100');
INSERT INTO tb_tree (id, pid, full_path) VALUES (101, 99, '99-100-101');
INSERT INTO tb_tree (id, pid, full_path) VALUES (201, 200, '200-201');
现在有如下需求:
- 如果存在根节点的数据,那么这个根节点的所有叶子结点都忽略,只保留根节点,如上面id为1,2,3,4的数据,因为2,3,4都是1的叶子结点,因此只筛选出id为1的数据
- id为100,101,根节点没有出现在数据中,因此保留当前出现的最顶级节点,但是其叶子结点都忽略
- 尝试先将pid=0也就是根节点的数据先取出来,然后筛选,但是因为整个节点还有分支,貌似5.7不支持两个集合取交集
为什么一定要通过sql来实现,这种属于业务逻辑的,用代码来做不是更好维护