RobRobson: Matrix aus 3 Tabellen

Hallo Selfhtmler,

ich bekomme keine Lösung mit SQL hin weiß jemand wie man an das Problem rangeht?

3 Tabellen
TabA -> MengeA
TabB -> MengeB
TabC -> Verknüpft m_A mit n_B -> [id | TabA_id | TabB_id]

Aus den 3 Tabellen soll eine Matrix generiert werden.
X-Achse eine Spalte der TabA und als y-Achse eine Spalte der TabB.

Die Verknüpfungstabelle gibt wieder welche der Schnittpunkte in der Matrix bereits verknüpft sind.
Angezeigt werden sollen aber alle möglichen Schnittpunkte.
Sprich alle Werte aus TabA_Spalte und TabB_Spalte und falls der Schnittpunkt schon eine bestehende Verknüpfung ist, diese auch. (Man stelle sich eine Matrix aus vielen Checkboxen vor die entweder checked sind oder eben unchecked wenn noch keine Verknüpfung besteht)

In PHP wäre das leicht zu lösen.

  1. Menge A einlesen -> ArrayA
  2. Menge B einlesen -> ArrayB
  3. VerknüpfungsTab einlesen
    3.1) durch die Arrays rauschen und checkboxen je nach verknüpfung setzen.

Leider ist diese Variante zu Rechenintensiv für meinen Server und die Latenz damit zu hoch.
Es soll also mit (möglichst) einer SQL Abfrage gelöst werden. Habe jetzt schon viel mit Subselects und verschiedenen Joinarten herum probiert aber mir fehlt noch der logische Grundgedanke es in SQL zu lösen. Theoretisch würden in der DB-Antwort viele Felder leer bleiben (unverknüpfte Stellen) ich bin aber nicht mal sicher das SQL das überhaupt kann.

Würde mich über einen Denkanstoss oder Ansatz freuen :D

Danke und viele Grüße,
Rob

  1. Hallo,

    also wenn ich das richtig verstehe, brauchst du nur 2 Joins:

    1. einen Cross-Join zwischen Tabelle A und Tabelle B => Damit bekommst du alle deine möglichen Verknüpfungspunkte.
    2. davon ausgehend nun einen Left-Outer-Join auf die Tabelle C mit der Bedingung, das genau dieser Punkt schon in der Tabelle C vorhanden ist.
    Left-Outer-Join deshalb, weil du mit einem Inner-Join ja alle Datensätze wieder rausfiltern würdest, bei denen der Join nicht aufgeht, sprich: wo noch keine Verknüpfung besteht.
    Dann kannst du mittels decode (in Oracle-Sprache) oder case sehen, ob dort schon ein Punkt ist.

    Also ca. so:

    select tabA.id, tabB.id, case when tabC.id is not null then 'Verknüpfung vorhanden' else 'Keine Verknüpfung' end  
    from tabA  
    cross join tabB  
    left outer join tabC on tabC.tabA_id = tabA.id  
                        and tabC.tabB_id = tabB.id
    

    Für diese Lösung gebe ich aber keine Gewähr :-)

    lG,
    Gerhard

    1. Hallo Gerhard,

      sorry wegen der Latenz, konnte erst jetzt weiter dran arbeiten.

      Für diese Lösung gebe ich aber keine Gewähr :-)

      Die Lösung ist super! Und geht weit über das hinaus was ich bis jetzt mit mysql gemacht habe. :-D
      Also schonmal vielen Dank dafür!
      Es hat auch vom Start weg funktioniert.

      Jetzt is nur noch ein Problem, der else Zweig wird nie betreten, denn Verknüpfungen die nicht existieren, stehen auch nicht in Tab_C. Oder anderes herum gesagt in der Tab_C stehen nur die Fälle in denen Tab_A mit Tab_B verknüpft wurde. Unangezeigt bleiben alle Einträge aus Tab_A die keine Verknüpfung (über Ta_bC) mit Tab_B haben. Aber auch diese möchte ich gerne i Ergebniss angezeigt haben (als "ELSE 'notlinked'").

      lG,
      Gerhard

      Viele Grüße,
      Rob

      1. Hallo,

        Also schonmal vielen Dank dafür!

        Bitteschön :-)

        Jetzt is nur noch ein Problem, der else Zweig wird nie betreten, denn Verknüpfungen die nicht existieren, stehen auch nicht in Tab_C. Oder anderes herum gesagt in der Tab_C stehen nur die Fälle in denen Tab_A mit Tab_B verknüpft wurde. Unangezeigt bleiben alle Einträge aus Tab_A die keine Verknüpfung (über Ta_bC) mit Tab_B haben. Aber auch diese möchte ich gerne i Ergebniss angezeigt haben (als "ELSE 'notlinked'").

        Dann hast du irgendwas falsch gemacht. Ich habs schnell selber ausprobiert und mit meinem SELECT genau das gewünschte Ergebnis erhalten (also inklusive der Ergebnisse aus dem ELSE-Zweig).

        lG,
        Gerhard