列id
、列parent
、およびpath
実体化されたパスである列があります。
のように見えます
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/%';
最初にないのでIDを1または19に置き換えるまでは問題なく動作/
します。
SELECT * FROM `tester` WHERE 'path' LIKE '%1/%';
番号が1で終わるすべての行を選択するため、1、11、21、31、211など
SELECT * FROM `tester` WHERE 'path' LIKE '1/%';
行1または19のいずれかで正しく機能します
だからSELECT * FROM
テスターWHERE 'path' LIKE '1/%' OR 'path' LIKE '%/1/%'
;
私が思いつくことができる最高のものはありますか、何か提案はありますか?
この
Select * from
テスターの場合、9の直接の子を選択しますが、サブの子は選択しませんwhere 'parent' = 9
。正常に動作します。
xレベルの深さの9の子の総数を選択します。
したがって、最終的に1行level1, level2, level3, ... levelx
またはx行のいずれかで、さまざまなレベルを表します。
この例では、xが3であると仮定します。この例の行は次のようになります9, 8, 6
(要求した場合は4番目のレベルが3になります)
何か案は?
編集
#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;