Announcement

Collapse
No announcement yet.

Baumstruktur im MySQL

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Baumstruktur im MySQL

    Hi,

    ich hab ein SQL Problem, wo ich grad etwas auf dem Schlauch stehe.

    Ich habe eine Tabelle "Master", eine "Child" und eine "Outputs" Tabelle.

    Ein Eintrag in der Child-Tabelle gehört immer zu nur einem einzigen Master, aber ein Master kann beliebig viele Childs haben. (1:n verknüpfung)
    Genauso mit der Outputs-Tabelle, ein Output gehört immer zu einem Child, aber ein Child kann beliebig viele Outputs haben.

    Die verknüfungen sind über je eine connection-tabelle gelöst in der einfach die 2 Primary-Key-IDs der Tabellen stehen.

    Ich habe also diese Tabellen:

    Code:
    Master
    Master_Child_Connection
    Child
    Child_Output_Connection
    Output
    Die ID-Spalten heißen immer wie die Tabelle, nur mit "id_" davor (id_Master, id_Child, id_Output).


    So, ich möchte jetzt eine SQL Abfrage machen in der ich eine ID von einem Master als WHERE Angeben kann und alle Outputs erhalte die über die Childs mit dem Master verknüpft sind.
    Die Childs bekommen ist ja kein Problem, das geht einfach via:

    Code:
    SELECT * FROM Child JOIN(Master_Child_Connection) USING(`id_Child`) JOIN(Master) USING(`id_Master`) WHERE `id_Master` = 42
    Klar könnte ich jetzt hergehen und für jedes Child im Ergebnis der Abfrage wiederrum eine SQL-Abfrage machen.. aber das können dann echt viele werden, und das würde ich gern vermeiden. Nur... geht das?



    Und eine andere Problemstellung wäre eine eine art Baumstruktur.
    Die Outputs können beliebig viele Outputs als "Input" haben. Also ein Output gehört zu einem Child, setzt sich aber aus vielen Outputs anderer Childs zusammen (n:m verbindung)
    Es ergibt also einen Baum der am ende auf einen Output zuläuft.

    Jetzt würde ich gern eine Abfrage machen wo ich nur eine OutputID angebe und ALLE Inputs im Baum erhalte..
    Meine aktuelle lösung ist wieder ganz viele einzel-Querys zu machen, aber das ist eben nur bedingt gut...

    Hat da irgendwer eine Idee wie ich das lösen kann?

    Aya

    PS: Im Anhang ist ein Bild was das ganze etwas verdeutlichen soll.

    PS2: Habe das gleiche auch hier schonmal gefragt:
    http://www.delphi-forum.de/viewtopic.php?t=100226

    Da wurde gesagt ich brauche "Hierarchische Selects", aber die gibt es wohl im MySQL nicht... aber evtl gibt es ja doch noch einen anderen weg?
    Attached Files

  • #2
    Evtl. könnte dir hier "Nested Sets" weiter helfen.
    Bei SQL-Code bitte beachten: Formatierung von SQL in Beiträgen

    Comment


    • #3
      Also erstens mal braucht eine 1:n Verbindung keine Verbindungstabelle. Diese braucht man erst für n:m Beziehung. Wenn ein Output zu einem Child gehört, dann schreibt man in den Datensatz des Outputs die ID des Childs rein.

      Abfragen kann man das dann auch ganz einfach:

      [highlight=sql]
      SELECT m.MasterName, o.*
      FROM master m
      JOIN child c ON c.MasterId = m.MasterId
      JOIN output o ON o.ChildId = c.ChildId
      [/highlight]

      Baumstrukturen bildet man in der Datenbank mit selbstrefefenzierung ab. Sprich eine Tabelle referenziert sich selbst:

      Code:
      Output
      =======
      IdOutput number PrimaryKey
      Output_Value number
      ParentOutput number FK_AUF_ParentOutput
      ChildId number FK_AUF_Child
      Je nach Datenbank wird sogar die Auswertung einer solchen Baumstruktur unterstützt

      Comment

      Working...
      X