Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Auswahl basierend auf dem Pfad in mysql

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:

  1. 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, '/', '')) )
  2. Wir müssen 1 zu dieser Zahl hinzufügen, da ein Pfad mit 1 Schrägstrich 2 Ebenen tief ist.
  3. Wir fügen die x gewünschte Anzahl von Ebenen hinzu.
  4. Nehmen Sie die Pfadspalte bis zum Gesamtlevel (Verwenden Sie die SUBSTRING_INDEX Funktion).
  5. Fügen Sie den führenden und abschließenden Schrägstrich hinzu.
  6. Suchen Sie in der letzten Zeichenfolge nach 9.