2016-08-09 104 views
0

Ich habe eine Tabelle wie dieseWie Tischfuß auf sie Spalte auszuwählen

+-------------+---------------+-----------+ 
| employee_id | employee_name | upline_id | 
+-------------+---------------+-----------+ 
| 1   | Andin   | 0   | 
+-------------+---------------+-----------+ 
| 2   | Budi   | 1   | 
+-------------+---------------+-----------+ 
| 3   | Citra   | 2   | 
+-------------+---------------+-----------+ 
| 4   | Doni   | 2   | 
+-------------+---------------+-----------+ 
| 5   | Erik   | 3   | 
+-------------+---------------+-----------+ 
| 6   | Gana   | 4   | 
+-------------+---------------+-----------+ 

dann, wenn ich wählen, wo employee_id 2 ist, ist es, die Daten wie diese zeigt

+-------------+---------------+-----------+ 
| employee_id | employee_name | upline_id | 
+-------------+---------------+-----------+ 
| 2   | Budi   | 1   | 
+-------------+---------------+-----------+ 
| 3   | Citra   | 2   | 
+-------------+---------------+-----------+ 
| 4   | Doni   | 2   | 
+-------------+---------------+-----------+ 
| 5   | Erik   | 3   | 
+-------------+---------------+-----------+ 
| 6   | Gana   | 4   | 
+-------------+---------------+-----------+ 

weil in employee_id auch ist 2 die Kinder, die upline_id 2 haben, dann Kinder, die noch Upline haben, werden bis zum letzten looping, wer nicht die upline_id hat, ist gleich wie die employee_id. Ich hoffe, Sie verstehen, sorry mein Englisch sehr schlecht.

, wenn ich wählen Sie die employee_id 3 die Daten zeigt, wie diese

+-------------+---------------+-----------+ 
| employee_id | employee_name | upline_id | 
+-------------+---------------+-----------+ 
| 3   | Citra   | 2   | 
+-------------+---------------+-----------+ 
| 5   | Erik   | 3   | 
+-------------+---------------+-----------+ 

Ich weiß nicht wirklich, was ich frage, hehe

postgre oder mysql

+2

Ich bin verwirrt: -/hehe – 1000111

+1

Sie sagen, Sie haben diese Art von Abfrage bereits? Oder willst du Hilfe beim Schreiben? – sagi

+0

Das ist meine Frage zu @sagi – 1000111

Antwort

0

Das Modell, das Sie für die Speicherung Ihrer hierarchischen Daten übernommen haben, wird als "Adjazenzliste" bezeichnet.

Leider unterstützt MySQL keine rekursiven Funktionen, also müsste man bei einem solchen Modell einen Self-Join für jede Ebene der Hierarchie machen, die man durchqueren möchte - aber es sollte offensichtlich sein, dass das nicht ist. t eine sehr skalierbare Lösung.

PostgreSQL, auf der anderen Seite unterstützt rekursive CTEs, mit denen Sie tun:

WITH RECURSIVE tree AS (
    SELECT id, name, ARRAY[]::INTEGER[] AS ancestors 
    FROM employees 
    WHERE upline_id = 0 

    UNION ALL 

    SELECT employees.id, employees.name, tree.ancestors || employees.upline_id 
    FROM employees JOIN tree ON employees.upline_id = tree.id 
) SELECT * FROM tree WHERE 2 = ANY(tree.ancestors) 

Dies kann jedoch für große Graphen sehr ineffizient erweisen.

Die bessere Beratung ist Ihre Daten neu zu gestalten entweder „verschachtelte Sätze“ oder eine Tabelle der „transitive Schließung“ des Diagramms verwenden. @Bill Karwin Präsentation, Models for Hierarchical Data in SQL and PHP ist eine ausgezeichnete Erklärung/Vergleich der verschiedenen Ansätze.