felix l.: NestedSets - Korrektheit eines gegebenen Pfads

Hallo,

gegeben ist eine Struktur mit NestedSets in einer MySql-Tabelle. Zusätzlich zu den left und right Werten besitzt jeder Eintrag eine eindeutige id.
Nun erhalte ich z.B. 3 ids in Folge, und möchte prüfen, ob dies der NestedSets-Ordnung entspricht, ob also diese Folge von ids einen korrekten Pfad in der NestedSets-Tabelle darstellt.

Dafür suche ich eine elegante Lösung mit einem MySql-Statement.
Bisher nehm ich die erste id Frag die left und right Werte ab und gehe dann zur nächsten id und Prüfe ob dessen left und right Werte innerhalb der vorherigen liegen usw.
Dies hat den Vorteil, ich kann dann auch sagen, biswohin der Pfad stimmt.

Nun interessiert mich aber, ob es auch eine elegantere Lösung gleicht direkt mit dem MySqlStatement gibt.

Gruß

  1. Hallo Felix,

    gegeben ist eine Struktur mit NestedSets in einer MySql-Tabelle.

    welche MySQL-Version?

    Zusätzlich zu den left und right Werten besitzt jeder Eintrag eine eindeutige id.

    Beispiel mit Daten?

    Nun erhalte ich z.B. 3 ids in Folge,

    es könnten also beliebig viele sein, die Reihenfolge spielt eine Rolle?

    und möchte prüfen, ob dies der NestedSets-Ordnung entspricht, ob also diese Folge von ids einen korrekten Pfad in der NestedSets-Tabelle darstellt.

    Dafür suche ich eine elegante Lösung mit einem MySql-Statement.

    Wie wäre es mit

      
    SELECT my_nested_set_is_path(id1, id2, id3) 
    ~~~?  
      
    Elegant genug? ;-)  
      
      
    Freundliche Grüße  
      
    Vinzenz
    
    1. Hallo,

      welche MySQL-Version?

      MySql 5
      MyISAM

      Beispiel mit Daten?

      id (jetzt pfad) / left / right / ...
      pkw / 1 / 4 / ...
      bmw / 2 / 3 / ...
      lkw / 5 / 12 / ...
      leicht / 6 / 9 / ..
      bmw / 7 / 8 / ...
      schwer / 10 / 11 / ..

      Es können beliebig viele Pfadkürzel ankommen und die Reihenfolge spielt eine Rolle. Soll ja auch geprüft werden auf Richtigkeit.

      Wie wäre es mit

      SELECT my_nested_set_is_path(id1, id2, id3)

        
      Entschuldige, das verstehe ich nicht.  
        
      Gruß
      
      1. Morgen,

        habe nun folgendes gefunden:

        SELECT p.*
        FROM tree n, tree p
        WHERE n.lft BETWEEN p.lft AND p.rgt AND n.name = TIEFSTE_EBENE_VOM_PFAD
        ORDER BY n.lft

        Gibt mir den Pfad zu dem tiefsten Element im Pfad z.B. pkw/bmw/auto.

        Das würde mich schon weiter bringen, denn ist das Ergebnis leer, weiß ich dass ichs mim nächsthöheren probieren kann, um den Surfer möglivhst sinnvoll auf ne andere Seite zu leiten oder ihm eine Suche zur Verfügung stellen kann.

        Nun tut das ja eigentlich gut, aber ich habe folgendes Szenario:
        pkw/bmw wird aufgerufen.
        So würde ich mit obigen String nach dem Pfad zu bmw suchen, der bekanntlich einmal unter pkw und einmal unter lkw existiert.

        Kann man das Statement nicht irgendwie so aufbauen, dass er jedes Element berücksichtigt und die left und right Werte auch überprüft?

        Oder wie wird das sonst praxistauglich umgesetzt?

        Gruß

        1. Morgen,

          ich könnte natürlich auch auf einen Materialized Path umschwenken, die Vorteile von Nested Sets kann ich mir dann allerdings abschminken.

          Setzt niemand NestedSets auf vergleichbare Weise ein und prüft die korrekte Pfadfolge?

          Gruß