Abychom vás upozornili, tato řešení jsou založena na porovnání řetězců, nejsou optimalizována a nemohou používat indexy. měli byste zvážit jinou normalizaci tabulek. (Viz Správa hierarchických dat v MySQL )
K některým otázkám:
Vyberte všechny potomky s ID 9:
Od Path
sloupec neobsahuje úvodní a koncová lomítka, musíte je zřetězit do cesty:
SELECT *
FROM tester
WHERE CONCAT('/', path, '/') LIKE '%/9/%';
vyberte celkový počet 9 dětí, x úrovní hloubky:
Musíme seskupit podle počtu lomítek v cestě mínus počet lomítek v nadřazené cestě:
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
Pro jednoduchost jsem použil výše uvedený dotaz k zobrazení všech úrovní. Pokud chcete omezit x úrovní hluboko, použijte WHERE
predikát z dotazu níže.
vyberte ID dětí 9 až na x úrovní, přičemž úroveň je relativní k 9:
Hledáme Path
sloupec až do x počtu úrovní, přičemž se bere v úvahu úroveň rodičů:
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/%'
Kroky, které podnikáme:
- Musíme zjistit, jak hluboko je rodič, to zjistíme spočítáním lomítek v cestě rodiče. (
LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', ''))
) - K tomuto číslu musíme přidat 1, protože cesta s jedním lomítkem je hluboká 2 úrovně.
- Přidáme x počet požadovaných úrovní.
- Uchopte sloupec cesty až po celkovou úroveň (Použijte
SUBSTRING_INDEX
funkce). - Přidejte úvodní a koncové lomítko.
- Vyhledejte v posledním řetězci 9.