2016-12-08 4 views
1

Ich habe eine Tabelle wie folgt aus:Wie kann ich alle Eltern hierarchisch auswählen?

// tags 
+----+--------------+-----------+---------+ 
| id | tag_name | parent_id | related | 
+----+--------------+-----------+---------+ 
| 1 | programming | NULL  | 1  | 
| 2 | medical  | NULL  | 2  | 
| 3 | juridical | NULL  | 3  | 
| 4 | HTML   | 1   | 1  | 
| 5 | PHP   | 1   | 1  | 
| 6 | function  | 5   | 1  | 
| 7 | ampoule  | 2   | 2  | 
| 8 | needle  | 7   | 2  | 
| 9 | CSS   | 1   | 1  | 
| 10 | echo   | 5   | 1  | 
| 11 | padding  | 9   | 1  | 
+----+--------------+-----------+---------+ 

Auch habe ich diesen Wert: function. Jetzt möchte ich alle seine Eltern auswählen. So wird dies erwartet Ergebnis:

+----+--------------+-----------+---------+ 
| id | tag_name | parent_id | related | 
+----+--------------+-----------+---------+ 
| 1 | programming | NULL  | 1  | 
| 5 | PHP   | 1   | 1  | 
+----+--------------+-----------+---------+ 

Wie kann ich das tun?


Hinweis:related Spalte hat nichts mit dieser Frage zu tun. Es hat es hinzugefügt, weil ich manchmal alle in Verbindung stehenden Markierungen (beide Eltern und Kinder) auswählen muss.

+1

MySQL nicht hierarchische Daten zu speichern, ausgelegt. Die einzige Möglichkeit, dies zu tun, ist die Verwendung einer gespeicherten Prozedur mit einer while-Schleife. Sie können die Daten jedoch etwas anders speichern, als Sie möchten. Hier ist ein guter Blog-Post über Möglichkeiten, dies zu tun: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/. –

Antwort

0

Es könnte besser sein, eine Ebene nach der anderen aus Ihrem Code zu bekommen, um seine Daten zu erhalten. Aber wenn Sie wissen, wie viele Ebenen Sie in Ihren Hierarchien haben, können Sie Code dafür vorbereiten.

Wenn Sie maximal 4 Hierarchien einschließlich der letzten Ebene haben, würde dieser Code funktionieren. Dann können Sie weitere Vereinigungen für mehr Ebenen hinzufügen oder die letzte Vereinigung entfernen, wenn Sie nicht so viele Ebenen haben.

Ich habe den Namen 'Tabellenname' auf Ihrem Tisch hier und schrieb es einfach schnell zusammen, aber das sollte funktionieren. Lass es mich wissen, wenn es nicht funktioniert und ich werde versuchen, einen MySQL-Server zu finden, gegen den ich laufen kann.

SELECT t1.* 
FROM tableName t1 
JOIN tableName t2 ON t1.id = t2.parent_id 
WHERE t2.tag_name = 'function' 
UNION ALL 
SELECT t1.* 
FROM tableName t1 
JOIN tableName t2 ON t1.id = t2.parent_id 
JOIN tableName t3 ON t2.id = t3.parent_id 
WHERE t3.tag_name = 'function' 
UNION ALL 
SELECT t1.* 
FROM tableName t1 
JOIN tableName t2 ON t1.id = t2.parent_id 
JOIN tableName t3 ON t2.id = t3.parent_id 
JOIN tableName t4 ON t3.id = t4.parent_id 
WHERE t4.tag_name = 'function' 
ORDER BY ID 

(Ändern ‚Funktion‘ in eine Variable ist natürlich eine gute Idee)

Verwandte Themen