Frage

Ich arbeite mit mySQL, und ich bin in einer Situation, wo ich brauche Daten aus einer Tabelle auswählen, die auf jeder Ebene in Elternteil eine ID übereinstimmt. -> Kind Datenhierarchie in der anderen Tabelle

Weiter mehr, würde Ich mag diese mit einer gut geschriebenen SQL-Abfrage zu lösen, anstatt eine rekursive Funktion in meinem PHP-Code, da diese Funktion wird ziemlich viel verwendet werden.

Ich habe versucht die Suche, und ich habe auf zahlreiche ähnliche Probleme (die meisten von ihnen werden aufgelöst), aber keiner von ihnen hat mir geholfen, gestolpert.

Um die Situation zu erläutern, hier ist meine aktuelle Setup

Tabelle "Artikel":

  • article_id
  • category_id
  • ...

Tabelle Kategorien

  • category_id
  • parent_id
  • ...

Ich brauche von „Artikel“, um alle Artikel zu wählen, in dem „articles.category_id“ ist, sagen wir mal, 10. Aber auch aus allen Kategorien aus dem Baum alle Artikel erhalten die „categories.category_id“ 10 gehört.

Bedeutung, wobei „10“ ist die Mutter und alle seine Kinder, und nach oben, wobei 10 das Kind und all seine Eltern.

Mögliche ohne eine rekursive PHP-Funktion?

Danke.

War es hilfreich?

Lösung

Dies ist möglich, in MySQL zu tun, aber es dauert eine wenig Mühe. Hier finden Sie eine Funktion wie diese schreiben müssen:

CREATE FUNCTION hierarchy_connect_by_parent_eq_prior_id(value INT) RETURNS INT
NOT DETERMINISTIC
READS SQL DATA
BEGIN
        DECLARE _id INT;
        DECLARE _parent INT;
        DECLARE _next INT;
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET @id = NULL;

        SET _parent = @id;
        SET _id = -1;

        IF @id IS NULL THEN
                RETURN NULL;
        END IF;

        LOOP
                SELECT  MIN(id)
                INTO    @id
                FROM    categories
                WHERE   parent = _parent
                        AND id > _id;
                IF @id IS NOT NULL OR _parent = @start_with THEN
                        SET @level = @level + 1;
                        RETURN @id;
                END IF;
                SET @level := @level - 1;
                SELECT  id, parent
                INTO    _id, _parent
                FROM    categories
                WHERE   id = _parent;
        END LOOP;
END

und es in einer Abfrage verwenden:

SELECT  id, parent, level
FROM    (
        SELECT  hierarchy_connect_by_parent_eq_prior_id(id) AS id, @level AS level
        FROM    (
                SELECT  @start_with := 0,
                        @id := @start_with,
                        @level := 0
                ) vars, categories 
        WHERE   @id IS NOT NULL
        ) ho
JOIN    categories hi
ON      hi.id = ho.id

Sehen Sie diesen Eintrag in meinem Blog für weitere Informationen:

Andere Tipps

Es ist nicht möglich, einen ganzen Baum in einer Abfrage mit dem Adjazenzliste Design Sie verwenden, gegeben zu holen, dass Sie MySQL verwenden.

Einige andere Marken von Datenbank-Unterstützung SQL-Erweiterungen diese Art von Design zu handhaben. Oracle, Microsoft SQL Server, IBM DB2 und PostgreSQL 8.4 (derzeit in der Beta-Version) Unterstützung SQL-Erweiterungen.

Andere Datenbankentwürfe gibt, die es Ihnen ermöglichen, Bäume effizienter abzufragen. Diese Frage wurde in den Artikeln oft auf Stackoverflow angesprochen, auf Blogs und.

Sie können auch die " Bäume und Hierarchien in SQL für Smarties " von Joe Celko, die in mehrere solche Konstruktionen in die Tiefe geht.

Die häufigsten Muster für hierarchische Daten in einer relationalen Datenbank gespeichert werden, entweder benachbart Liste oder diese Tabelle für einen Vergleich der Vor- und Nachteile .

Ich weiß nicht, wie viel würde diese Ihnen helfen, aber ich eine kleine Funktion geschrieben, die einen hierarchischen Baum mit einem einzigen MySQL Abfrage generiert. Grundsätzlich werden alle wichtigen Logik in PHP bewegt. Meine Lösung verwendet das Modell Adjazenzliste und macht dann den Einsatz von PHP Referenzen, um eine Baumdatenstruktur mittels einem flachen zu bauen. Schauen Sie sich auf das Wesentliche unten und sehen Sie, wenn Sie etwas Inspiration bekommen. Ich würde Ihnen mehr helfen, aber es gibt einige Probleme, die ich mit in meinem Job zu tun haben.

http://gist.github.com/104357

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top