kostenloser Webspace werbefrei: lima-city


Effizienter SQL-Query

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    sl1nk

    sl1nk hat kostenlosen Webspace.

    Hallo!

    Folgendes Datenbankenmodel (DBMS: MySQL)
    TableA <-> T2T <-> TableB
    TableC <-> T2T <-> TableD,

    also ManyToMany-Relations zwischen allen Tabellen A,B,C,D über die T2T-Tabelle. (Die PKs der Tabellen A, B, C und D sind "über alle Tabellen" unique.) Wobei T2T die Eingräge ID und ID1 hat, und so die Tabellen related.

    Ich bin jetzt auf der Suche nach einem effektiven SQL-Query der folgendes tut:
    Alle Element aus TableA Joinen mit:
    allen Elementen aus B, mit
    allen Elementen aus C und D.

    Also folgende Tupel sind erlaubt:
    TableA TableB TableC TableD
      x     NULL   NULL   NULL
      x      x     NULL   NULL
      x     NULL    x      x
      x      x      x      x.

    Mein etwas unglücklicher Ansatz in einem Query:
    SELECT  
      a.ID, b.ID, c.ID, d.ID
    FROM  TableA a
    -- der relationen aufruf
    LEFT JOIN  T2T t2t ON (T2T.ID1 = a.ID OR T2T.ID = a.ID)
    -- a -> t2t -> b
    LEFT JOIN TableB b ON (b.ID = t2t.ID OR b.ID = t2t.ID1)       
    -- a -> t2t -> c -> u2u -> d
    LEFT  JOIN TableC c  ON (t2t.ID = c.ID OR t2t.ID1 = c.ID) 
    INNER JOIN T2T  u2u  ON (u2u.ID = c.ID OR u2u.ID1 = c.ID)
    INNER JOIN TableD d  ON (u2u.ID = d.ID OR u2u.ID1 = d.ID)


    Anmerkung T2T hat die Einträge ID und ID1, da ich mir momentan nicht sicher bin, wie die Relationen gemappt werden, müssen momentan die teuren OR-Anweisungen herhalten. Sind die fest, ist mir klar, dass die Effizienz enorm steigt. (Ich hoffe ich hab beim Ändern der Namen keine Fehler eingebaut).

    Das Problem hier ist, dass T2T TabelleA mit weiteren Tabellen mapped, die zwei LEFT JOINS bewirken also, dass unnötige Einträge gefetched werden.
    Optimal wäre doch eine Kontrolle, dass mindestens TableB oder TableC einträge haben. Eine weitere möglichkeit wären ja 2 Abfragen (UNION) mit INNER JOIN für TableB und TableC, da werden die anderen Relationen rausgefilter.Gibt es einen effizienten Weg das in einem SQL-Query hinzubekommen? Und vllt. noch zusätzlich einen "schönen"? ;)

    Grüße,
    sl1nk

    Beitrag zuletzt geändert: 12.9.2015 19:54:30 von sl1nk
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!