Sehr schwieriger JOIN über 7 Tabellen in unterschiedlicher Hierarchie

  • Hallo zusammen,


    ich habe da ein mittelschweres Problem, ich hoffe ihr könnt mir da helfen.


    Und zwar möchte ich einen JOIN über einige Tabellen machen damit mir die Inhalte aller Tabellen in einem Datensatz angezeigt werden (natürlich nur die, die mit einander zusammenhängen).


    So sieht meine Datenbanksruktur aus:


    Tabelle A
    --GUID (Primärschlüssel)
    --Spalte1
    --Spalte2


    Tabelle B
    --GUID
    --Spalte1


    Tabelle C
    --GUID (Primärschlüssel)
    --ref1GUID (Fremdschlüssel zu Tabelle A)
    --ref2GUID (Fremdschlüssel zu Tabelle B)
    --Spalte1
    --Spalte2


    Tabelle D
    --GUID
    --refGUID (Fremschlüssel zu Tabelle A)
    --Spalte1
    --Spalte2


    Tabelle E
    --GUID
    --refGUID (Fremdschlüssel zu Tabelle D)
    --Spalte1
    --Spalte2


    Tabelle F
    --GUID
    --refGUID (Fremdschlüssel zu Tabelle D)
    --Spalte1
    --Spalte2


    Tabelle G
    --GUID
    --refGUID (Fremdschlüssel zu Tabelle D)
    --Spalte1
    --Spalte2


    Tabelle H
    --GUID
    --refGUID (Fremdschlüssel zu Tabelle D)
    --Spalte1
    --Spalte2


    Tabelle I
    --GUID
    --refGUID (Fremdschlüssel zu Tabelle D)
    --Spalte1
    --Spalte2


    Ist quasi eine Baumstruktur mit der Tabelle A als Root.


    Einen Join vertikal im Baum bekomme ich ohne Probleme hin, jedoch wenn ich Tabellen die auf der selben Ebene (also horizontal) mit in den Join nehme zeigt er mir die Datensätze mehrfach an obwohl nur eins Angezeigt werden sollte.


    Ich hoffe das war einigermaßen verständlich erklärt und ihr könnt mir weiter helfen.


    Greetz
    Franz

  • Hä?


    Zeigt doch mal dein Statement!
    Dann wird evtl. einleuchtender, so du LEFT oder RIGHT oder was auch immer JOINen müsstest, damit die Schnittmenge stimmt.

    the0bone


    Wissen ist Macht, nichts Wissen macht nichts! Doch auch wenn man es nicht besser weiss, sollte man beim Erstellen einer Webseite auf Tabellen verzichten.

  • Danke schonmal für das bemühen :)


    Um den Join dreht es sich ja, denn bekomme ich nicht hin...


    Als Bild anbei die Struktur nochmal visualisiert.
    - die grün umrandeten Tabellen bekomme ich einen Join hin, dazu siehe weiter unten
    - die rot umrandeten bekomme ich nicht mehr hin, da zeit er mir dann im Ergebniss Duplikate an
    - die gelb umrandeten sind die Tabellen die ich eigentlich vor habe in einem Join zu vereinen


    Hier der Join der funktioniert für die grün umrandeten Tabellen:


    SQL
    1. SELECT *
    2. FROM tabelle_A a
    3. JOIN tabelle_D d
    4. JOIN tabelle_G g on
    5. a.GUID = d.refGUID and
    6. d.GUID = g.refGUID;


    Wenn ich nun eine weiter Tabelle (bspw. Tabelle H mit AND oder OR) hinzupacke, spuckt er mir bereits duplikate aus.
    Ich komme einfach nicht drauf wie ich denn Join gestalten muss damit ich alle Daten in eine Reihe im Ergebniss bekomme :(


    traumprojekt.com/attachment/44326/

  • Nee da können N Datensätze drin sein die dann zu einem Datensatz in Tabelle D gehören.


    Tabelle D hat immer nur 0-5 Datensätze die zu Tabelle A gehören, es gibt in Tabelle D ein Attribut "Type" welches dann bestimmt ob der Datensatz zu Tabelle E, F, G, H oder I gehört.

  • Gut, MySQL kann keine CTE... daher muss ich selber erst mal umdenken.


    Habe mir erstmal eine DemoTabelle gebaut.

    the0bone


    Wissen ist Macht, nichts Wissen macht nichts! Doch auch wenn man es nicht besser weiss, sollte man beim Erstellen einer Webseite auf Tabellen verzichten.

  • Geht doch:

    SQL
    1. SELECT *
    2. FROM TabA a
    3. INNER JOIN TabD d ON d.refaID = a.aID
    4. INNER JOIN TabE e ON e.refdID = d.dID
    5. INNER JOIN TabG g ON g.refdID = d.dID

    the0bone


    Wissen ist Macht, nichts Wissen macht nichts! Doch auch wenn man es nicht besser weiss, sollte man beim Erstellen einer Webseite auf Tabellen verzichten.

    2 Mal editiert, zuletzt von the0bone ()

  • Leider nicht ganz. Ich hab mal die Inserts verkürzt und so angepasst wie sie bei mir vorhanden sind.
    Wenn ich nun deinen Join ausführe bekomme ich keine Datensätze mehr, obwohl mind. einer eigentlich im Result sein sollte.


    Hier die verkürzten Inserts:


    Zur Erklärung
    - in Tabelle D referenzieren 5 Datensätze auf einen Datensatz in Tabelle A
    - in Tabelle E-I referenzieren alle 5 Datensätze auf jeweils einen Datensatz in Tabelle D

  • Nein, nach deiner Kürzung kommt bei mir auch nichts mehr raus, da:
    D hat auf dID und E refdID eine Schnittmenge auf 1
    Aber D und G haben über die dID eine Schnittmenge auf 3
    Also gibt es keine gemeinsame Schnittmenge oder du JOINst wieder mit einer Verdoppelung und NULL

    the0bone


    Wissen ist Macht, nichts Wissen macht nichts! Doch auch wenn man es nicht besser weiss, sollte man beim Erstellen einer Webseite auf Tabellen verzichten.

  • Ich hatte einen Fehler in meiner Denkweise, es kann so gar nicht funktionieren ohne mehrfacher gleicher Datensätze, da ja für die Tabellen E-I immer der gleiche Datensatz aus Tabelle A referenziert wird (Tabelle B & C mal ausgenommen weil ja da wieder rum mehrfach die selben Daten referenziert werden). Ich habe es nun teilweise mit JOINs gemacht und zusätzlich noch mit einzelnen Abfragen.


    Vielen Dank für die schnelle und gute Hilfe :)


    *ThumpsUp*

  • Code
    1. DROP TABLE `TabA`, `TabB`, `TabC`, `TabD`, `TabE`, `TabF`, `TabG`, `TabH`, `TabI`;

    caipi

    the0bone


    Wissen ist Macht, nichts Wissen macht nichts! Doch auch wenn man es nicht besser weiss, sollte man beim Erstellen einer Webseite auf Tabellen verzichten.

  • Die Komplexität Deiner Abfrage deutet auf eine falsche Konzeption hin.


    Die Frage sollte nicht lauten, wie Du per Join 7 Tabellen verbinden kannst, sondern wie Du diese Funktionalität so abbildest, dass sie auch ein Dritter versteht ;-)

    ...Meine Meinung :)

  • Hi,
    habe die Diskussion nur überflogen, aber wenn du Duplikate ausschließen möchtest, könntest du das ja per SELECT DISTINCT vielleicht in den Griff bekommen. Mal als Ansatz...

    live long and prosper...

  • Ist doch aber gaga, erst ein join zu machen, der die doppelten erstellt und dann zu Filtern...

    the0bone


    Wissen ist Macht, nichts Wissen macht nichts! Doch auch wenn man es nicht besser weiss, sollte man beim Erstellen einer Webseite auf Tabellen verzichten.