Само за да ви предупредя, тези решения се основават на сравнения на низове, не са оптимизирани и не могат да използват индекси. трябва да помислите за нормализиране на вашите таблици по различен начин. (Вижте Управление на йерархични данни в MySQL )
Относно някои от въпросите:
Изберете всички дъщерни на идентификатор 9:
Тъй като Path
колоната не включва водещите и крайните наклонени черти, трябва да ги свържете към пътя:
SELECT *
FROM tester
WHERE CONCAT('/', path, '/') LIKE '%/9/%';
изберете общ брой деца на 9, х нива:
Трябва да групираме по броя на наклонените черти в пътя, минус броя на наклонените черти в родителския път:
SELECT (LENGTH(c.Path) - LENGTH(REPLACE(c.Path, '/', '')))
- (LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', ''))) AS Level,
COUNT(*)
FROM tester c
JOIN tester p ON c.Parent = p.ID
WHERE CONCAT('/', path, '/') LIKE '%/9/%';
GROUP BY 1
За простота използвах заявката по-горе, за да покажа всички нива. Ако искате да ограничите x нива дълбоко, използвайте WHERE
предикат от заявката по-долу.
изберете идентификатора на децата на 9 до x нива, с нивото спрямо 9:
Търсим в Path
колона до x брой нива, като се вземе предвид нивото на родителите:
SELECT c.*
FROM tester c
JOIN tester p ON c.Parent = p.ID
WHERE CONCAT(
'/',
SUBSTRING_INDEX(
Path,
'/',
(LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', ''))) + 4
),
'/') LIKE '%/9/%'
Стъпките, които предприемаме:
- Трябва да разберем колко дълбоко е родителят, можем да го открием, като преброим наклонените черти в пътя на родителя. (
LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', ''))
) - Трябва да добавим 1 към това число, тъй като път с 1 наклонена черта е дълбок 2 нива.
- Добавяме x броя на желаните нива.
- Вземете колоната за пътя до общото ниво, (Използвайте
SUBSTRING_INDEX
функция). - Добавете началната и крайната наклонена черта.
- Търсете в последния низ за 9.