Nur um Ihnen einen Hinweis zu geben:Diese Lösungen basieren auf Zeichenfolgenvergleichen, sind nicht optimiert und können keine Indizes verwenden. Sie sollten erwägen, Ihre Tabellen anders zu normalisieren. (Siehe Hierarchische Daten in MySQL verwalten )
Zu einigen der Fragen:
Alle Kinder von ID 9 auswählen:
Da der Path
Spalte die führenden und abschließenden Schrägstriche nicht enthält, müssen Sie sie mit dem Pfad verketten:
SELECT *
FROM tester
WHERE CONCAT('/', path, '/') LIKE '%/9/%';
wählen Sie eine aggregierte Anzahl von 9 untergeordneten Elementen, x Ebenen tief:
Wir müssen nach der Anzahl der Schrägstriche im Pfad gruppieren, abzüglich der Anzahl der Schrägstriche im übergeordneten Pfad:
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
Der Einfachheit halber habe ich die obige Abfrage verwendet, um alle Ebenen anzuzeigen. Wenn Sie x Ebenen tief begrenzen möchten, verwenden Sie das WHERE
Prädikat aus der Abfrage unten.
Wählen Sie die untergeordneten IDs von 9 bis zu x Ebenen aus, wobei die Ebene relativ zu 9 ist:
Wir suchen den Path
Spalte bis zu x Ebenen unter Berücksichtigung der übergeordneten Ebene:
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/%'
Die Schritte, die wir unternehmen:
- Wir müssen herausfinden, wie tief der Elternteil ist, das können wir herausfinden, indem wir die Schrägstriche im Pfad des Elternteils zählen. (
LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', ''))
) - Wir müssen 1 zu dieser Zahl hinzufügen, da ein Pfad mit 1 Schrägstrich 2 Ebenen tief ist.
- Wir fügen die x gewünschte Anzahl von Ebenen hinzu.
- Nehmen Sie die Pfadspalte bis zum Gesamtlevel (Verwenden Sie die
SUBSTRING_INDEX
Funktion). - Fügen Sie den führenden und abschließenden Schrägstrich hinzu.
- Suchen Sie in der letzten Zeichenfolge nach 9.