MySQL Eltern -> Kind Abfrage
-
09-09-2019 - |
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.
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.