4 Stimmen

MySQL: Alle Unterkategorien, Nachkommen erhalten

Ich habe MySQL-Tabellen definiert als:

Kategorien: category_id, category_name, parent_category_id

Ich suche nach einer geeigneten SQL-Abfrage, die alle NACHKOMMEN eines bestimmten category_id abruft. Das bedeutet, seine Kinder und die Kinder seiner Kinder.

Wenn das hilft, können wir von einer maximalen Anzahl von Ebenen ausgehen (3). Diese Abfrage könnte auf jeder Ebene gesendet werden (Wurzel, Ebene 2, Ebene 3).

Vielen Dank!

Nathan

5voto

jonnii Punkte 27657

Es gibt einige Möglichkeiten, Bäume in einer Datenbank zu speichern. Auf sitepoint gibt es einen fantastischen Artikel, der alle Techniken beschreibt:

http://articles.sitepoint.com/article/hierarchical-data-database/2

Die geeignetste Methode, wenn Sie einen gesamten Abschnitt eines Baumes in einer Abfrage erhalten möchten, ist die Modifizierte Preorder-Tree-Traversal.

Diese Technik wird auch als Nested Sets bezeichnet. Hier finden Sie weitere Informationen, wenn Sie mehr Literatur zum Thema wünschen:

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

2voto

BalusC Punkte 1034465

Es kann mit einer einzigen Abfrage und einem Stück rekursiver Backend-Code-Logik erledigt werden: Formatieren eines mehrstufigen Menüs mit nur einer Abfrage.

Wenn Sie auch PHP verwenden, enthält dieser Artikel ein PHP-Beispiel als Bonus, aber das Übersetzen in eine andere Sprache ist nicht so schwer. Da Sie die Serversprache, die Sie verwenden, nicht erwähnt haben, kann ich Ihnen keine Hinweise dazu geben.

Hoffe, das hilft.

1voto

Lukasz Lysik Punkte 10282

Wenn Sie diese Struktur mit maximal 3 Ebenen verwenden möchten, können Sie die Tabelle dreimal mit sich selbst verbinden:

SELECT 
    c1.id AS level_1, 
    c2.id AS level_2, 
    c3.id AS level_3
FROM categories c1
LEFT JOIN categories c2 ON c1.id = c2.parent_id
LEFT JOIN categories c3 ON c2.id = c3.parent_id
WHERE c1.parent_id IS NULL

Ich gehe davon aus, dass Elternkategorien NULL in parent_id haben.

Ein Beispiel:

DECLARE @categories TABLE 
(
    id INT,
    parent_id INT
)

INSERT INTO @categories(id,parent_id) VALUES(1,NULL)
INSERT INTO @categories(id,parent_id) VALUES(4,1)
INSERT INTO @categories(id,parent_id) VALUES(5,1)
INSERT INTO @categories(id,parent_id) VALUES(6,5)
INSERT INTO @categories(id,parent_id) VALUES(2,NULL)

SELECT * FROM @categories

SELECT c1.id AS level_1, c2.id AS level_2, 
    c3.id AS level_3
FROM @categories c1
LEFT JOIN @categories c2 ON c1.id = c2.parent_id
LEFT JOIN @categories c3 ON c2.id = c3.parent_id
WHERE c1.parent_id IS NULL

Ergebnisse:

level_1 | level_2 | level_3
---------------------------
1       | 4       | NULL
1       | 5       | 6
2       | NULL    | NULL

0voto

Andomar Punkte 224164

MySQL unterstützt keine rekursiven Abfragen, aber Sie können alle Nachkommen mithilfe eines gespeicherten Verfahrens mit einer WHILE-Schleife finden. Siehe den The edge list Abschnitt dieses Buchbeispiels.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X