Hans A. Plast: mysql query gesucht

Hallo,

Ich mache bislang folgende Abfrage:

  
select  
b.spalte1,  
t.spalte2,  
t.spalte3,  
l.spalte4,  
t.spalte5,  
t.spalte6  
FROM tabelle1 b, tabelle2 t, tabelle3 l  
WHERE b.ID = t.ID AND  
b.L_ID = l.K_ID AND  
b.M_ID=\"".againstinjection($f_ID,int)."\" AND  
t.spalte9 > 0  

Nun möchte ich die Abfrage erweitern. Es geht darum, dass ich 2 Spalten einer weitere Tabelle "tabelle4" einbeziehen möchte. Tabelle Tabelle4 ist über den Key ID mit der ID von Tabelle2 verbunden.

Würde nun zu jedem Eintrag von Tabelle2 auch ein entsprechender Eintrag in Tabelle4 existieren, wäre es einfach für mich.

Aber da das nicht der Fall ist, muss ich wohl oder über joinen und das fällt mir sehr schwer. Meine o.g. Methode stößt aber genau hier an seine Grenzen. Die beiden Fachartikel zum Thema aus SelftHTML habe ich immer wieder gelesen. Ein Link dahin wäre dennoch nochmal nett, ich finde sie nicht mehr.

Grüße, Hans

  1. Hi!

    Es geht darum, dass ich 2 Spalten einer weitere Tabelle "tabelle4" einbeziehen möchte.
    Würde nun zu jedem Eintrag von Tabelle2 auch ein entsprechender Eintrag in Tabelle4 existieren, wäre es einfach für mich.
    Aber da das nicht der Fall ist, muss ich wohl oder über joinen und das fällt mir sehr schwer.

    Du joinst bereits jetzt, verwendest dazu aber die implizite Syntax, sprich: die Tabellennamen hintereinander aufgezählt und die Verknüpfungsbedingung steckt mit in der WHERE-Klausel. Explizit (und übersichtlicher, wie die vermutlich meisten Fortgeschrittenen finden) sähe das so aus:

    FROM tabelle1 b  
    JOIN tabelle2 t ON b.ID = t.ID  
    JOIN tabelle3 l ON b.L_ID = l.K_ID  
    WHERE b.M_ID = wert AND t.spalte9 > 0
    

    Die Verknüpfungsbedingungen stehen direkt beim JOIN, nur die Auswahl einschränkenden Bedingungen stehen im WHERE.

    Und mit dieser expliziten Schreibweise kannst du auch andere JOIN-Typen als den INNER JOIN verwenden, in deinem Fall einen LEFT JOIN.

    FROM tabelle1 b  
    JOIN tabelle2 t ON b.ID = t.ID  
    JOIN tabelle3 l ON b.L_ID = l.K_ID  
    LEFT JOIN tabelle4 x ON x.ID = t.ID
    

    Du hast nicht gesagt, welche Daten du auch dann haben möchtest, wenn es kein Pendant dafür gibt. Ich bin mal davon ausgegangen, dass die Daten der Tabelle 2 auch dann in der Ergebnismenge enthalten sein sollen, wenn es keinen Eintrag in Tabelle 4 gibt.

    TabelleA LEFT JOIN TabelleB  ergibt alles aus der links stehenden Tabelle und wenn vorhanden das aus der rechts stehenden ansonsten stattdessen NULL-Werte.

    Die beiden Fachartikel zum Thema aus SelftHTML habe ich immer wieder gelesen. Ein Link dahin wäre dennoch nochmal nett, ich finde sie nicht mehr.

    Die verstecken sich im "Anhang" SELFHTML aktuell, dort unter SELFHTML-Artikel unter Datenbanken.

    Lo!

    1. (und übersichtlicher, wie die vermutlich meisten Fortgeschrittenen finden) sähe das so aus:

      Hi dedlfix,

      ja, das habe ich schon ab und an mal gelesen, dass Fortgeschrittene diese Schreibweise übersichtlicher finden.

      Und im Grunde hast Du Recht, sie ist es auch.

      FROM tabelle1 b

      JOIN tabelle2 t ON b.ID = t.ID
      JOIN tabelle3 l ON b.L_ID = l.K_ID
      WHERE b.M_ID = wert AND t.spalte9 > 0

      
      >   
        
        
      Ihr Antwortenden (Du grad zum Glück \_nicht\_) unterschätzt immer wiederr, wie hilfreich zum Verstehen so ein paar Zeilen Code sind. Ich habe erstmalig das gefühl, dass diese Schreibweise wirklich übersichtlicher ist und werde meine Queries fortan nur noch auf diese Schreibweise joinen.  
        
        
        
      
      > Und mit dieser expliziten Schreibweise kannst du auch andere JOIN-Typen als den INNER JOIN verwenden, in deinem Fall einen LEFT JOIN.  
      >   
        
        
      Das hatte ich inzwischen sogar herausgefunden. Aber ich wußte nicht, wie ich den in meine Schreibweise hätte einfügen können.  
      Nun, nach dem Umbau meiner Query auf die neue Schreibweise ist natürlich sehr viel verständlicher geworden.  
        
        
      
      > Du hast nicht gesagt, welche Daten du auch dann haben möchtest, wenn es kein Pendant dafür gibt. Ich bin mal davon ausgegangen, dass die Daten der Tabelle 2 auch dann in der Ergebnismenge enthalten sein sollen, wenn es keinen Eintrag in Tabelle 4 gibt.  
      >   
        
        
      Genau so war es auch gedacht.  
        
      Danke, dedlfix, für Deine (wirklich sehr hilfreiche!) Hilfe. Ich habe sie angewandt und auf mein Problem umgesetzt. Alles hat klasse geklappt und die Links sind auch schon zu Lesezeichen geworden und ich werde mich ihnen jetzt nochmal widmen.  
        
      MfG, Hans  
        
      
      
      1. Mahlzeit Hans A. Plast,

        Ihr Antwortenden (Du grad zum Glück _nicht_) unterschätzt immer wiederr, wie hilfreich zum Verstehen so ein paar Zeilen Code sind.

        Bitte beziehe das jetzt folgende nicht auf Dich und diesen konkreten Fall - aber dieses Statement fordert geradezu heraus, folgendermaßen zu antworten:

        "Ihr Fragenden unterschätzt immer wieder, wie nervig das ewige und immer wiederkehrende Aus-dem-Ärmel-schütteln von kurzem Beispielcode ist ... vor allem, wenn dieser Beispielcode in tausendfacher Ausfertigung bereits im Forumsarchiv vorhanden und durch eine einfache Suche[1] problemlos auffindbar ist."

        Nicht jeder "Newbie" ist gleich - aber es kommt doch häufig vor, das Leute einfach eine Frage nach der anderen stellen, ohne auch nur ein einziges Mal die Suche, die FAQ und vor allem nicht die Charta angesehen zu haben ...

        [1] Zitat von der Forumshauptseite:

        "Von dir als Teilnehmer erwarten wir HTML-Grundkenntnisse, sowie die Bereitschaft, zunächst erst einmal mit der Suchfunktion im Archiv nach ähnlichen Problemen zu suchen. Lies unsere FAQ, dort sind häufig gestellte Fragen direkt beantwortet.

        Zum Mitmachen im SELFHTML Forum haben wir einige grundsätzliche Verhaltensregeln, die du in der Forums-Hilfe nachlesen kannst. Wir erwarten, dass du die Charta des Forums kennst und die dort genannten Regeln einhältst."

        Das sind IMHO recht einfache und überschaubare Bedingungen - warum fällt es nur immer wieder Leuten schwer, das zu akzeptieren und sich daran zu halten? Diese Regeln dienen doch nicht dazu, den einzelnen zu gängeln, sondern um das Miteinander für alle Teilnehmer einfacher und produktiver zu gestalten ...

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|