Stammbaum SQL Abfrage

  • Hallo an alle Mitglieder
    ich hätte eine Frage und vielleicht hat jemand einen Vorschlag oder eine Idee, wie man dies umsetzen könnte.

    Es geht um Ahnenforschung und genauer gesagt um eine Stammbaumsuche.

    Ich weiß, dass es sehr knifflig und kompliziert ist, darauf hat uns die Professorin aufmerksam gemacht, ich will es dennoch so versuchen.

    Wir haben Personen, die mit diversen Informationen gespeichert sind. Wichtig ist hier die ID aus der Tabelle person.
    Diese ist verknüpft mit einer zweiten Tabelle verwandschaft, diese beinhaltet ID, ID_Vater und ID_Mutter.

    Jetzt ist die Frage, wie verknüpft man die Informationen so, dass z.B. Person A, die man einträgt (Vorname, Nachname, Geb. Datum und Geschlecht), mit weiteren Personen verknüpft wird BIS man alle Verwandte aufgelistet hat.

    Wir starten unten und müssen die ID der Person mit den ID's der anderen Personen und deren Eltern verknüpfen und das immer und immer wieder. So, dass ein Baum entsteht, dieser von unten nach oben angezeigt werden soll:

    etc.

    Großmutter von P-A Großvater von P-A
    Mutter von P-AVater von P-A
    Person A

    Ist dies ein zu großer und komplizierter Aufwand, der kaum geschaffen werden kann oder ist dies eine Idee, die umsetzbar wäre?
    Eine Idee? Meinung?

    Nette Grüße

  • Ein paar Abfragen:
    SELECT v1.ID, v2.ID, v2.ID_Vater, v2.ID_Mutter
    FROM verwandtschaft AS v1
    INNER JOIN verwandtschaft AS v2
    ON v1.ID = v2.ID_Mutter
    Hier kommt leider kein Ergebnis, aber auch keine Fehlermeldung. Dies ist die Verknüpfung

    [h=1]Fehler[/h]SQL-Befehl: [Blockierte Grafik: http://localhost/phpmyadmin/themes/dot.gif]

    SELECT v1.ID, v2.ID, v2.ID_Vater, v2.ID_Mutter
    FROM verwandtschaft AS v1
    INNER JOIN verwandtschaft AS v2
    ON v1.ID = v2.ID_Mutter
    IN (SELECT Vorname, Nachname
    FROM person
    JOIN verwandtschaft
    ON verwandtschaft.ID=person.ID
    WHERE verwandtschaft.ID_Mutter
    OR verwandtschaft.ID_Vater) LIMIT 0, 25
    MySQL meldet: [Blockierte Grafik: http://localhost/phpmyadmin/themes/dot.gif]
    #1241 - Operand should contain 1 column(s)

    Ich habe überlegt, wenn ich ein Ergebnis bekommen würde, diesen in einem Array zu speichern und damit weiter arbeiten.

    Im Internet findet man auch diverse Fragen zum "Stammbaum", dieser ist aber anders strukturiert.
    Wir haben die Mutter_ID und Vater_ID und ID(der Person), die in zwei Tabellen steht damit man diese verknüpfen kann.
    Tabelle person:

    [TABLE='class: table_results ajax pma_table']

    [tr]


    [TH='class: column_action print_ignore, colspan: 4'] [Blockierte Grafik: http://localhost/phpmyadmin/themes/pmahomme/img/s_fulltext.png] [/TH]
    [TH='class: draggable right column_heading pointer marker'] ID [/TH]
    [TH='class: draggable column_heading pointer marker'] Geschlecht [/TH]
    [TH='class: draggable column_heading pointer marker'] Titel [/TH]
    [TH='class: draggable column_heading pointer marker'] Vorname [/TH]
    [TH='class: draggable column_heading pointer marker'] Nachname [/TH]
    [TH='class: draggable column_heading pointer marker'] Geburtsdatum [/TH]
    [TH='class: draggable column_heading pointer marker'] Geburtsname [/TH]
    [TH='class: draggable column_heading pointer marker'] Geburtsort [/TH]
    [TH='class: draggable column_heading pointer marker'] Beruf [/TH]
    [TH='class: draggable column_heading pointer marker'] Sterbedatum [/TH]
    [TH='class: draggable column_heading pointer marker'] Sterbeort [/TH]
    [TH='class: draggable column_heading pointer marker'] Notizen [/TH]

    [/tr]


    [TR='class: odd']
    [TD='class: center print_ignore'] [/TD]
    [TD='class: edit_row_anchor center print_ignore'] [Blockierte Grafik: http://localhost/phpmyadmin/themes/dot.gif] Bearbeiten [/TD]
    [TD='class: center print_ignore'] [Blockierte Grafik: http://localhost/phpmyadmin/themes/dot.gif] Kopieren [/TD]
    [TD='class: center print_ignore'] [Blockierte Grafik: http://localhost/phpmyadmin/themes/dot.gif] Löschen [/TD]
    [TD='class: right data grid_edit click2 not_null nowrap']1[/TD]
    [TD='class: data grid_edit click2 not_null text']w[/TD]
    [TD='class: data grid_edit click2 text null']NULL[/TD]
    [TD='class: data grid_edit click2 not_null text']Olivia
    [/TD]
    [TD='class: data grid_edit click2 not_null text']Walter
    [/TD]
    [TD='class: data grid_edit click2 not_null text']27.06.1996[/TD]
    [TD='class: data grid_edit click2 text null']NULL[/TD]
    [TD='class: data grid_edit click2 text']Stadt
    [/TD]
    [TD='class: data grid_edit click2 text']Student[/TD]
    [TD='class: data grid_edit click2 text null']NULL[/TD]
    [TD='class: data grid_edit click2 text null']NULL[/TD]
    [TD='class: data grid_edit click2 null']NULL[/TD]
    [/TR]
    [TR='class: even']
    [TD='class: center print_ignore'] [/TD]
    [TD='class: edit_row_anchor center print_ignore'] [Blockierte Grafik: http://localhost/phpmyadmin/themes/dot.gif] Bearbeiten [/TD]
    [TD='class: center print_ignore'] [Blockierte Grafik: http://localhost/phpmyadmin/themes/dot.gif] Kopieren [/TD]
    [TD='class: center print_ignore'] [Blockierte Grafik: http://localhost/phpmyadmin/themes/dot.gif] Löschen [/TD]
    [TD='class: right data grid_edit click2 not_null nowrap']3[/TD]
    [TD='class: data grid_edit click2 not_null text']m[/TD]
    [TD='class: data grid_edit click2 text null']NULL[/TD]
    [TD='class: data grid_edit click2 not_null text']Fabian
    [/TD]
    [TD='class: data grid_edit click2 not_null text']Walter
    [/TD]
    [TD='class: data grid_edit click2 not_null text']31.07.1993[/TD]
    [TD='class: data grid_edit click2 text null']NULL[/TD]
    [TD='class: data grid_edit click2 text']Stadt
    [/TD]
    [TD='class: data grid_edit click2 text null']NULL[/TD]
    [TD='class: data grid_edit click2 text null']NULL[/TD]
    [TD='class: data grid_edit click2 text null']NULL[/TD]
    [TD='class: data grid_edit click2 null']NULL[/TD]
    [/TR]
    [TR='class: odd']
    [TD='class: center print_ignore'] [/TD]
    [TD='class: edit_row_anchor center print_ignore'] [Blockierte Grafik: http://localhost/phpmyadmin/themes/dot.gif] Bearbeiten [/TD]
    [TD='class: center print_ignore'] [Blockierte Grafik: http://localhost/phpmyadmin/themes/dot.gif] Kopieren [/TD]
    [TD='class: center print_ignore'] [Blockierte Grafik: http://localhost/phpmyadmin/themes/dot.gif] Löschen [/TD]
    [TD='class: right data grid_edit click2 not_null nowrap']4[/TD]
    [TD='class: data grid_edit click2 not_null text']w[/TD]
    [TD='class: data grid_edit click2 text null']NULL[/TD]
    [TD='class: data grid_edit click2 not_null text']Julia
    [/TD]
    [TD='class: data grid_edit click2 not_null text']Walter
    [/TD]
    [TD='class: data grid_edit click2 not_null text']18.03.1966[/TD]
    [TD='class: data grid_edit click2 text']Sassenfeld[/TD]
    [TD='class: data grid_edit click2 text']Stadt
    [/TD]
    [TD='class: data grid_edit click2 text']Technische Zeichnerin, Tagesmutter[/TD]
    [TD='class: data grid_edit click2 text null']NULL[/TD]
    [TD='class: data grid_edit click2 text null']NULL[/TD]
    [TD='class: data grid_edit click2 null']NUL[/TD]
    [/TR]
    [/TABLE]


    Tabelle verwandtschaft:
    [TABLE='class: table_results ajax pma_table']

    [tr]


    [TH='class: column_action print_ignore, colspan: 4'] [Blockierte Grafik: http://localhost/phpmyadmin/themes/pmahomme/img/s_fulltext.png] [/TH]
    [TH='class: draggable right column_heading pointer marker'] ID [/TH]
    [TH='class: draggable right column_heading pointer marker'] ID_Mutter [/TH]
    [TH='class: draggable right column_heading pointer marker'] ID_Vater [/TH]

    [/tr]


    [TR='class: odd']
    [TD='class: center print_ignore'] [/TD]
    [TD='class: edit_row_anchor center print_ignore'] [Blockierte Grafik: http://localhost/phpmyadmin/themes/dot.gif] Bearbeiten [/TD]
    [TD='class: center print_ignore'] [Blockierte Grafik: http://localhost/phpmyadmin/themes/dot.gif] Kopieren [/TD]
    [TD='class: center print_ignore'] [Blockierte Grafik: http://localhost/phpmyadmin/themes/dot.gif] Löschen [/TD]
    [TD='class: right data grid_edit click2 not_null nowrap']1[/TD]
    [TD='class: right data grid_edit click2 nowrap']4[/TD]
    [TD='class: right data grid_edit click2 null']NULL[/TD]
    [/TR]
    [TR='class: even']
    [TD='class: center print_ignore'] [/TD]
    [TD='class: edit_row_anchor center print_ignore'] [Blockierte Grafik: http://localhost/phpmyadmin/themes/dot.gif] Bearbeiten [/TD]
    [TD='class: center print_ignore'] [Blockierte Grafik: http://localhost/phpmyadmin/themes/dot.gif] Kopieren [/TD]
    [TD='class: center print_ignore'] [Blockierte Grafik: http://localhost/phpmyadmin/themes/dot.gif] Löschen [/TD]
    [TD='class: right data grid_edit click2 not_null nowrap']3[/TD]
    [TD='class: right data grid_edit click2 nowrap']4[/TD]
    [TD='class: right data grid_edit click2 null']NULL[/TD]
    [/TR]
    [/TABLE]


    Hier ist der Vater unbekannt...

    • Offizieller Beitrag

    Hallo,

    Deine Query ist fehlerhaft, ein ON ... P1 = P2 IN ( ... ) gibt es nicht bzw. macht keinen Sinn, weil zunächst die Klammer ausgewertet wird, das Ergebnis auf P2 IN angewendet wird, was am Ende einen boolschen Wert ergibt, welcher auf P1 geprüft wird. An der Stelle kommt übrigens auch der SQL-Fehler, weil die Subquery mehr als ein Feld pro Datensatz liefert.

    Grundsätzlich ist Dein Vorhaben bis zu den Eltern relativ leicht umsetzbar, aber spätestens bei den Großeltern kommst Du in die Rekursion ( auf die Schnelle gefunden: http://www.infosys.tuwien.ac.at/teaching/cours…ve_Anfragen.pdf )

  • Wäre in dem Fall sinnvoller, erst das Ergebnis der Eltern der Person in einem Array zu speichern, so dass man dann diese je Generation sortiert hat.
    Diese Arrays kann man dann unabhängig von der Generation der ersten Person mit den Arrays der zweiten Person vergleichen, etc.

    Oder lieber genauso verbinden wie der Robert Schneeberger in seinem Skript?

    • Offizieller Beitrag

    Also meiner Meinung nach solltest Du das wirklich über Rekursion lösen.
    Was Du alternativ vorhast ist am Ende eine PHP-Logik, die permanent und vermutlich innerhalb von Schleifen SQL-Anfragen stellt. Das ist absolut suboptimal.

    Wie gesagt, ich würde mir das Thema Rekursion mit MySQL näher ansehen.
    Das ist jetzt auch nicht zwingend meine Stärke, aber wer weiß schon alles... ;)