1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Stammbaum rekursive Abfragen

Dieses Thema im Forum "Relationale Datenbanksysteme" wurde erstellt von MissJour, 10. Dezember 2016.

  1. MissJour

    MissJour Grünschnabel

    Hallo an alle, bin neu in dem Forum

    Ich mache mit einer Kommilitonin ein Projekt in der Uni und wir müssen in der Programmierwerkstatt eine Webseite gestalten + Datenbank anbinden etc.

    Soweit sogut. Wir haben das Thema Ahnenforschung und leider haben wir uns für komplizierte Abfragen entschieden, da wir nicht tausend Sachen in die Tabellen reinschreiben möchten.

    Die zwei wichtigsten Tabellen sind:

    ID - Geschlecht - Titel - Vorname - Nachname - Geburtsdatum - Geburtsname - Geburtsort - Beruf - Sterbedatum - Sterbeort - Notizen
    [​IMG] 1 - w - NULL - Nadine - Probol - 27.06.1996 - NULL - Darmstadt - Student - NULL - NULL - NULL
    [​IMG] 3 - m - NULL - Sascha - Probol - 31.07.1993 - NULL - Darmstadt - NULL - NULL - NULL - NULL
    [​IMG] 4 - w - NULL - Nicole - Probol - 18.03.1966 - Sassenfeld - Darmstadt Technische Zeichnerin, Tagesmutter - NULL - NULL - NULL

    und

    ID - ID_Mutter - ID_Vater
    1 - 4 - NULL
    3 - 4 - NULL

    Hier in den Beispielen haben wir keinen Vater eingetragen.

    Hier verbinden wir uns über das ID um die ID_Mutter und ID_Vater miteinzubeziehen.

    Ich tue mich ehrlich gesagt schon etwas schwer, denn so haben wir es in den Vorlesungen und Übung bei Relationalen Datenbanken nie gemacht.
    Wir haben ganz normal die Tabellen verbunden mit JOIN aber diese Abfragen übersteigen wirklich meine Fähigkeiten. Ich weiß leider nicht, wie ich das genau machen soll.


    SELECT Vorname, Nachname

    FROM person

    INNER JOIN verwandtschaft ON verwandtschaft.ID=person.ID

    Das ist ja Standart...

    In dem Sinne suchen wir aber Personen, die die selbe ID von den Eltern hat.

    Wir wollen es aber als Stammbaum machen, so dass erst die Eltern der Personen aufgeführt werden, dann Eltern von den Eltern etc etc...

    In der Uni helfen die Profs nicht, das weiß leider jeder und trotzdem kann man nichts dagegen tun.

    Aus Verzweiflung häbe ich aus Spaß gesagt, ich würde sogar jemanden für Hilfe bezahlen. Jetzt bin ich mir nicht sicher, ob es wirklich aus Spaß gemeint war...

    Nette Grüße

    PS: seid nicht gemein
     
  2. sheel

    sheel I love Asm Administrator

    Hi

    um welches DB-System geht es denn?

    Und was genau ist das Ziel? Einen Stammbaum hinzuzeichnen? Das muss ja nicht unbedingt mit nur einer SQL-Afrage passieren (geht mit "tabellarischen" DBs auch nicht so einfach).
     
  3. MissJour

    MissJour Grünschnabel

    PhpMyAdmin.

    Eine genaue Abfrage, dachte auch eher daran, ein Ergebnis in eine Schleife zu packen und dann weiter zu "suchen". Erstmal die Eltern, dann die Eltern der Mutter und/oder des Vaters... etc. soweit, dass alle Personen aufgelistet sind, die mit den Personen verwandt sind.

    Ich bin beim Programmieren echt der Durschnitt, müsste ich es nicht tun, würde ich es auch nicht tun. Nun aber verlässt sich meine Partnerin auf mich und so muss ich mein Bestes geben und es versuchen. Aber mir fällt sowas wirklich sehr, sehr schwer.
     
  4. sheel

    sheel I love Asm Administrator

    ist keine Datenbank, nur ein grafisches Zugriffsprogramm für ein paar DB-Programme :rolleyes:
    Mysql oder MariaDB?
     
  5. MissJour

    MissJour Grünschnabel

  6. MissJour

    MissJour Grünschnabel

    Hmm.. bin echt überfragt. Egal welche Abfragen ich versuche, das klappt nicht so wirklich.
     
  7. sheel

    sheel I love Asm Administrator

    WIe hast du den PHP-Code denn bisher aufgebaut?
     
  8. Yaslaw

    Yaslaw n/a Moderator

    Wenn du es unbedingt mit SQL machen willst/musst. Ich würde nicht. Aber es geht:
    [MySQL] Adjacency Tree
    Viel Spass damit
     
  9. MissJour

    MissJour Grünschnabel

    SELECT Vorname, Nachname
    FROM person
    INNER JOIN verwandtschaft ON verwandtschaft.ID=person.ID
    WHERE (
    SELECT *
    FROM person AS p1
    LEFT JOIN verwandtschaft AS v2 ON v2.ID_Mutter OR v2.ID_Vater = p1.id
    LEFT JOIN verwandtschaft AS v3 ON v3.ID_Mutter OR v3.ID_Vater = p1.id
    LEFT JOIN verwandtschaft AS v4 ON v4.ID_Mutter OR v4.ID_Vater = p1.id)

    Ich habe sowas versucht, funktioniert leider nicht :/

    Ich glaube es klappt nicht, da ich zwei Tabellen habe und nicht nur eine, wo alles zusammen ist.
    Normalerweise wenn ich unter der Thematik suche, finde ich nur Stammbäume, die in einer Tabelle sind (also child und parent) aber ich habe ja zwei Tabellen wegen den ID's der Eltern...
     
  10. MissJour

    MissJour Grünschnabel

    @Yaslaw
    Ich glaube das müssen wir leider von der Uni aus. Was gäbe es sonst für Vorschläge?
     
  11. Yaslaw

    Yaslaw n/a Moderator

     
  12. MissJour

    MissJour Grünschnabel

    Also das ist übertrieben kompliziert. Da blicke ich wirklich null durch...:(
     
  13. Yaslaw

    Yaslaw n/a Moderator

    Dann lass uns das mal angehen. Du hast jetzt ein Beispiel für eine Mutter mit 2 Kindern ohne Vater.
    Falls da per Zufall auch ein Vater vorhanden ist. Und der auch wieder Eltern hat, genauso wie die Mutter ja wieder Eltern hat.

    Wie soll denn das Resultat aussehen. Nicht in Worten. Mach ein Datenbeispiel einer 3-Generationenfamile.
    Also ein Beispielmit Daten und gewünschtes Resultat. Etwa so
     
  14. MissJour

    MissJour Grünschnabel

    Ok, also einmal die 2 Tabellen, erweitert so, dass die Person auch Großeltern hat.

    PERSON-TABELLE
    http://www.directupload.net/file/d/4567/n9v4g2h4_jpg.htm
    und
    VERWANDSCHAFT-TABELLE
    http://www.directupload.net/file/d/4567/zxmwdpz4_jpg.htm

    Als Bild. Wir wollen es jetzt so haben:
    (auf der Webseite als Endprodukt)
    http://www.directupload.net/file/d/4567/dpg9qct4_jpg.htm

    Im Endeffekt solk es o aussehen
    Code (Text):
    1. Vorname    |    Nachname
    2. ----------------------------------
    3. Aneta       |    De Vivo
    4. Mutter
    5. und Vater
    6. Vorname    |    Nachname
    7. ----------------------------------
    8. Miroslaw   |    Wrzos
    9.  
    10. Danach die Eltern der Personen (z.B.)
    11. Mutter der Mutter (Aneta)
    12. Vorname    |   Nachname
    13. ----------------------------------
    14. Maria     |   Józwiak
    15.  
    16. Vorname    |   Nachname
    17. ----------------------------------
    18. Leszek     |   Nawrot
    19.  
    20.  
    21. usw usf
    Es muss halt immer mit dem Zwischenergebnis gearbeitet werden.
    Deswegen dachte ich, dass man das Zwischenergebnis in eine Schleife packt und dann damit weiterarbeitet, aber ob's möglich ist weiß ich leider nicht.
     
  15. Yaslaw

    Yaslaw n/a Moderator

    In dieser Forma kann SQL das nicht ausgeben. Wasman kann, ist von jeder Person den Namen und die Namen der Eltern ausgeben
    Code (SQL):
    1. SELECT
    2.     p.Vorname AS person_vorname,
    3.     p.Nachname AS person_nachname,
    4.     m.Vorname AS mutter_vorname,
    5.     m.Nachname AS mutter_nachname,
    6.     v.Vorname AS vater_vorname,
    7.     v.Nachname AS vater_nachname
    8. FROM verwandtschaft vw
    9.     -- Person
    10.     LEFT JOIN person p
    11.     ON vw.ID = p.id
    12.     -- Mutter
    13.     LEFT JOIN person m
    14.     ON vw.ID_Mutter = m.id
    15.     -- Vater
    16.     LEFT JOIN person v
    17.     ON vw.ID_Vater = v.id[code]
     
  16. MissJour

    MissJour Grünschnabel

    Das ist auf jeden Fall eine große Hilfe und super ist es auch. Es sind halt alle Personen aufgelistet - wenn wir aber eine Person eingeben: z.B. in dem Falle mich Agnieszka Wrzos.
    In dem Moment, wenn ich meinen Namen eingebe, müsste das System erstmal in der Datenbank abgleichen ob diese Person in der Datenbank angelegt ist. Dann würde man es über die ID der Person mit den ID's der Eltern verknüpfen können, oder nicht?

    Ich habe von einem Bekannten sowas gekriegt:
    Select ID_Mutter, ID_Vater from verwandtschaft where ID=9

    (Die Namen zu den IDs kann man auch wieder durch zusätzliche
    SQL-Abfragen herausfinden), aber where ID=9 (in dem Falle ich) wäre schon festgelegt, was ja auch nicht der Sinn der Sache ist.
    Dazu bekam ich noch das:
    Dann noch die Eltern von Mutter und Vater:
    Select ID_Mutter, ID_Vater from verwandtschaft where ID=5
    Select ID_Mutter, ID_Vater from verwandtschaft where ID=8

    Also so nach diesem Prinzip wird gesucht, nach der ID.

    Dies stört mich aber, da wie gesagt direkt die ID festgelegt wird und ich möchte mich mit der ID nicht festlegen.
    Ist sowas möglich?

    Gruß
     
  17. Yaslaw

    Yaslaw n/a Moderator

    Einfach noch ein Wehre auf die Namen der Person hinzufügen
    Code (SQL):
    1. SELECT
    2.     p.Vorname AS person_vorname,
    3.     p.Nachname AS person_nachname,
    4.     m.Vorname AS mutter_vorname,
    5.     m.Nachname AS mutter_nachname,
    6.     v.Vorname AS vater_vorname,
    7.     v.Nachname AS vater_nachname
    8. FROM verwandtschaft vw
    9.     -- Person
    10.     LEFT JOIN person p
    11.     ON vw.ID = p.id
    12.     -- Mutter
    13.     LEFT JOIN person m
    14.     ON vw.ID_Mutter = m.id
    15.     -- Vater
    16.     LEFT JOIN person v
    17.     ON vw.ID_Vater = v.id
    18. WHERE
    19.     p.vorname = 'Agnieszka'
    20.     AND p.nachname = 'Wrzos'[code]
     
    MissJour gefällt das.
  18. MissJour

    MissJour Grünschnabel

    Vielen Dank @Yaslaw. Sie sind mir eine große Hilfe gewesen, sehr nett von Ihnen, dass Sie sich Zeit genommen haben,geholfen haben und dabei sehr geduldig waren. :) danke vielmals
     
Die Seite wird geladen...