Bare for at give dig et overblik, er disse løsninger baseret på strengsammenligninger, er ikke optimeret og kan ikke bruge indekser. du bør overveje at normalisere dine borde anderledes. (Se Håndtering af hierarkiske data i MySQL )
Med hensyn til nogle af spørgsmålene:
Vælg alle børn af id 9:
Siden Path
kolonnen inkluderer ikke de førende og efterfølgende skråstreger, du skal sammenkæde dem til stien:
SELECT *
FROM tester
WHERE CONCAT('/', path, '/') LIKE '%/9/%';
vælg et samlet antal af 9 børn, x niveauer dybt:
Vi skal gruppere efter antallet af skråstreger i stien, minus antallet af skråstreger i den overordnede sti:
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
For nemheds skyld brugte jeg forespørgslen ovenfor til at vise alle niveauerne. Hvis du vil begrænse x niveauer dybt, skal du bruge WHERE
prædikat fra forespørgslen nedenfor.
vælg 9's børns id'er ned til x niveauer, med niveauet i forhold til 9:
Vi søger på Path
kolonne op til et x antal niveauer, mens der tages hensyn til forældreniveauet:
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 trin, vi tager:
- Vi skal finde ud af, hvor dyb forælderen er, det kan vi finde ud af ved at tælle skråstregene i forælderens vej. (
LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', ''))
) - Vi skal tilføje 1 til det tal, da en sti med 1 skråstreg er 2 niveauer dyb.
- Vi tilføjer x antallet af ønskede niveauer.
- Få fat i sti-kolonnen op til niveautotal, (Brug
SUBSTRING_INDEX
funktion). - Tilføj den førende og efterfølgende skråstreg.
- Søg i den sidste streng efter 9.