2016-07-09 10 views
0

Ich hoffe, einige von Ihnen mysql Experten können mir helfen.mysql erhalten nur spezielle Daten für verschachtelte Set-Struktur

Wenn es eine Lücke im Baum gibt, dann will ich nicht die tieferen Kinder.

Beispiel:

root (depth 0) 
sub-cat 1 (depth 1) 
subsub-cat 1 (depth 2) 
subsubsubsub-cat 1 (depth 4) 

In diesem Fall wird ein Knoten in Tiefe 3 disable ist, ich nicht Knoten subsubsubsub-cat 1 und tiefer

Struktur benötigen:

id | parent_id | lft | rgt | depth | title 

Standardabfrage:

select * 
from categories 
where lft >= '1' and lft < '10000' 
order by lft asc 

Vielen Dank!

+0

Ein verschachtelter Satz existiert, so dass Sie nicht den ganzen Weg für spezielle Sachen überprüfen (es dauert nur jeden Knoten zwischen zwei Zahlen ist es nicht so wichtig, über Lücken), so dass dies nicht (einfach) möglich ist. Löschen Sie einfach alle untergeordneten Elemente, wenn Sie einen Knoten löschen (dies sollte ohnehin in einem Standard-Nested-Set-Algorithmus passieren). Wenn Sie die Knoten aus irgendeinem Grund erhalten möchten, verschieben Sie sie in eine andere verborgene (Unter-) Struktur oder fügen Sie eine Spalte hinzu und markieren Sie sie dann als unbenutzt/versteckt, anstatt sie zu löschen. – Solarflare

+0

Danke, vielleicht ist es nicht möglich, aber ich möchte nicht die Kategorien löschen, ich möchte die Kinder verstecken, wenn die Elternkategorie deaktiviert ist. Zum Beispiel: Kleidung> Mens> Jeans> Slim Zeigen Sie nicht Slim im Baum, wenn Jeans deaktiviert. – Tom

+0

Wie können Sie feststellen, ob ein Knoten deaktiviert ist? – Strawberry

Antwort

0

Lücken (wie in "gelöschte Zwischenknoten", eine fehlende parent_id oder ein Sprung in Ihrem depth-Wert) sind schwer zu erkennen oder sogar in einer verschachtelten Menge zu definieren (und diese Spalten werden nicht für eine verschachtelte Menge benötigt), Wenn Sie jedoch nur einen Knoten und alle seine untergeordneten Elemente ausblenden möchten, können Sie dies leicht tun, indem Sie Ihrem Baum eine Markierungsspalte hinzufügen, z hidden, und verwenden Sie nur diejenigen Knoten, die keine versteckten Vorgänger haben (oder mich versteckt):

select * 
from categories as node 
where not exists 
    (select 1 from categories as preds 
    where node.lft >= preds.lft 
     and node.rgt <= preds.rgt 
     and preds.hidden = 1) 
order by node.lft; 
+0

Großartig, perfekt, vielen Dank! – Tom

+0

Eine weitere Frage: Vielleicht haben Sie eine Idee, wie ich die Vorfahren Knoten für das Suchergebnis bekommen. Zum Beispiel wenn ich eine schlanke Jeans in Slim finde, zeige nur die Ahnen Kleidung> Herren> Jeans>. So habe ich ein Ergebnis und zeige nur die Knoten Kleidung> Mens> Jeans> Slim. – Tom

+0

@Tom Ja, das Abrufen dieses Pfads ist eine vollständige Standardabfrage für verschachtelte Sätze, siehe z. [Hierarchische Daten in MySQL verwalten] (http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/) (es wird Beispiele geben, um die Tiefe und die parent_id zu berechnen, also müssen Sie nicht habe Spalten dafür) – Solarflare