Bara för att ge dig en uppmärksam, dessa lösningar är baserade på strängjämförelser, är inte optimerade och kan inte använda index. Du bör överväga att normalisera dina tabeller annorlunda. (Se Hantera hierarkisk data i MySQL )
Angående några av frågorna:
Välj alla barn med id 9:
Eftersom Path
kolumnen innehåller inte de inledande och efterföljande snedstreck, du måste sammanfoga dem till sökvägen:
SELECT *
FROM tester
WHERE CONCAT('/', path, '/') LIKE '%/9/%';
välj en sammanlagd räkning av 9 barn, x nivåer djup:
Vi måste gruppera efter antalet snedstreck i sökvägen, minus antalet snedstreck i den överordnade sökvägen:
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
För enkelhetens skull använde jag frågan ovan för att visa alla nivåer. Om du vill begränsa x nivåer djupt, använd WHERE
predikat från frågan nedan.
välj 9:s barn-id ner till x nivåer, med nivån relativt 9:
Vi söker efter Path
kolumn upp till ett x antal nivåer, samtidigt som man tar hänsyn till föräldrarnas nivå:
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/%'
De steg vi tar:
- Vi måste ta reda på hur djup föräldern är, det kan vi hitta genom att räkna snedstreck i förälderns väg. (
LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', ''))
) - Vi måste lägga till 1 till det numret, eftersom en bana med 1 snedstreck är två nivåer djup.
- Vi lägger till x antalet önskade nivåer.
- Ta tag i sökvägskolumnen upp till nivåsumman, (Använd
SUBSTRING_INDEX
funktion). - Lägg till det inledande och efterföljande snedstrecket.
- Sök i den sista strängen efter 9.