我有一个列id,一个列父列和一个作为物化路径的列路径.
看起来像
1 | \N | 1
2 | 1 | 1/2
3 | 2 | 1/2/3
4 | 3 | 1/2/3/4
5 | 3 | 1/2/3/5
6 | 2 | 1/2/6
7 | 6 | 1/2/6/7
8 | 2 | 1/2/8
9 | 1 | 1/9
10 | 9 | 1/9/10
11 | 10 | 1/9/10/11
12 | 11 | 1/9/10/11/12
13 | 11 | 1/9/10/11/13
14 | 11 | 1/9/10/11/14
15 | 14 | 1/9/10/11/14/15
16 | 14 | 1/9/10/11/14/16
17 | 14 | 1/9/10/11/14/17
18 | 10 | 1/9/10/18
19 | \N | 19
20 | 19 | 19\20
21 | 19 | 19\21
我需要根据这个表做一些查询.
我需要做的查询是
选择所有id为9的孩子
SELECT * FROM `tester` WHERE 'path' LIKE '%/9/%';
工作正常,直到你用1或19替换ID,因为没有/在开头.
SELECT * FROM `tester` WHERE 'path' LIKE '%1/%';
将选择数字以1结尾的所有行,因此,1,11,21,31,211等
SELECT * FROM `tester` WHERE 'path' LIKE '1/%';
适用于第1行或第19行
所以SELECT * FROMtesterWHERE’路径’LIKE’1 /%’或’路径’LIKE’%/ 1 /%’;
我能想出最好的,有什么建议吗?
选择直接子女为9但不包括子女
对于这个Select * fromtesterwhere’parent’= 9;会很好的.
选择9个孩子的总计数,x级别深.
所以我想最终得到一行level1,level2,level3,… levelx或x行,代表不同的级别,
让我们假设这个例子的x是3
这个例子中的行将是9,8,6(如果我们要求它将是3级的第4级)
有任何想法吗?
编辑
#select count of children of specific node(5) down to a maximum of three levels, do no include the parent
SELECT COUNT(child.id) children,
LENGTH(REPLACE(child.path, parent.path, '')) - LENGTH(REPLACE(REPLACE(child.path, parent.path, ''), '/', '')) AS LEVEL
FROM `tester` child JOIN `tester` parent ON child.path LIKE CONCAT(parent.path,'%')
WHERE parent.id =5
GROUP BY LEVEL HAVING LEVEL <= 3 AND LEVEL > 0;
**选择9个孩子的id低至x等级,等级为9,
因此,对于此示例,我们将使用3作为x.
我们期待着回来
10 | 1
11 | 2
18 | 2
12 | 3
13 | 3
14 | 3
我再次完全失去了如何做到这一点.
编辑:
#select all information, and relative level from parent of children of specific node(5) down to a maximum of three levels, do no include the parent
SELECT child.*,
LENGTH(REPLACE(child.path, parent.path, '')) - LENGTH(REPLACE(REPLACE(child.path, parent.path, ''), '/', '')) AS LEVEL
FROM `tester` child JOIN `tester` parent ON child.path LIKE CONCAT(parent.path,'%')
WHERE parent.id =9
GROUP BY id HAVING LEVEL <= 3 AND LEVEL > 0;