Q.: Probleme mit left-join-Abfrage

Hallo,

habe 2 Tabellen.

Tabelle spieler:
spielerID, spielerName, spielerGeb, spielerGroesse, usw.

Tabelle Noten:
NotenSpielpaarung, NotenSaison, NotenVerein, NotenNote, NotenBemerkung, usw.

Wenn ich nun die Noten für jeden Spieler eintrage und möchte mir zwischendrin eine Liste anzeigen lassen, die mir alle Spieler (bspw. eines Vereins oder einer Spielpaarung) zeigt und diejenigen mit Note und Bemerkung befüllt, die bereits eingetragen sind und alle anderen freilässt, müsste das doch ungefähr so aussehen:

select s.spielerID, s.spielerName, NotenNote, NotenBemerkung
from spieler s, Noten
LEFT JOIN spieler ON spieler.spielerID = Noten.spielerID

Dachte ich jedenfalls, aber das Ergebnis ist ein ganz anderes (alleine, dass bei 50 Spielern und 50 Benotungen an die 1000 Ergebnisse kommen) .-(

Ich will einfach alle Spieler 1 mal aufgeführt haben. Einige wurden schon benotet und die anderen bekommen an die Stelle nen Input-Tag.

Wie muß denn der left-join hierzu aussehen?

Grüße, Q.

  1. Ich will einfach alle Spieler 1 mal aufgeführt haben. Einige wurden schon benotet und die anderen bekommen an die Stelle nen Input-Tag.

    Wie muß denn der left-join hierzu aussehen?

    errmm.. irgendwie hast du im Statement zwei mal die gleiche Table drin .. so müsste es gehen:

      
    SELECT S.spielerID, S.spielerName, N.NotenNote, N.NotenBemerkung  
    FROM spieler S  
    LEFT JOIN Noten N ON (S.spielerID = N.spielerID)  
    
    

    Gruß,
    Matty

    1. errmm.. irgendwie hast du im Statement zwei mal die gleiche Table drin .. so müsste es gehen:

      SELECT S.spielerID, S.spielerName, N.NotenNote, N.NotenBemerkung
      FROM spieler S
      LEFT JOIN Noten N ON (S.spielerID = N.spielerID)

      
      >   
      > Gruß,  
      > Matty  
        
      Hallo Matty,  
        
      erstmal vielen Dank. Nun bin ich meiner Lösung schon viel näher.  
      Leider müsste ich mein Ergebnis nochmal eingrenzen und jetzt wirds richtig schwer, denn:  
        
      Wenn ich die Abfrage auf einen Verein beschränken möchte, kann ich das nicht über "NotenVerein" aus der Tabelle Noten machen, weil ich dann nur die Spieler angezeigt bekomme, die bereits benotet sind.  
        
      Also müßte ich in der where-Klausel über weitere 2 Tabellen gehen:  
        
      Tabelle: Verein  
      VereinID, VereinSaison, VereinTrainer, usw.  
        
      Tabelle Vereinszugehoerigkeit:  
      ZugehoerigkeitsID, VereinID, SpielerID  
        
      Hast Du (oder auch jeder andere Interssierte) da auch noch ne Idee?  
        
      Grüße, Q.
      
      1. Wenn ich die Abfrage auf einen Verein beschränken möchte, kann ich das nicht über "NotenVerein" aus der Tabelle Noten machen, weil ich dann nur die Spieler angezeigt bekomme, die bereits benotet sind.

        Also müßte ich in der where-Klausel über weitere 2 Tabellen gehen:

        Tabelle: Verein
        VereinID, VereinSaison, VereinTrainer, usw.

        Tabelle Vereinszugehoerigkeit:
        ZugehoerigkeitsID, VereinID, SpielerID

        Hast Du (oder auch jeder andere Interssierte) da auch noch ne Idee?

        Grüße, Q.

        Ja dann müsst es doch so gehen:

          
        SELECT S.spielerID, S.spielerName, N.NotenNote, N.NotenBemerkung  
        FROM Verein V  
        LEFT JOIN Vereinszugehoerigkeit VZ ON (V.VereinID = VZ.VereinID)  
        LEFT JOIN spieler S ON (VZ.SpielerID = S.spielerID)  
        LEFT JOIN Noten N ON (S.spielerID = N.spielerID)  
        WHERE S.spielerID = 2  
        
        
        1. Ja dann müsst es doch so gehen:

          SELECT S.spielerID, S.spielerName, N.NotenNote, N.NotenBemerkung
          FROM Verein V
          LEFT JOIN Vereinszugehoerigkeit VZ ON (V.VereinID = VZ.VereinID)
          LEFT JOIN spieler S ON (VZ.SpielerID = S.spielerID)
          LEFT JOIN Noten N ON (S.spielerID = N.spielerID)
          WHERE S.spielerID = 2

            
          Hi Matty,  
            
          Du meinst sicher "WHERE V.VereinName = Barfuß Trallalla", aber leider ist das im Ergebnis genau das, was ich nicht haben möchte. Denn mit dieser Abfrage bekomme ich aus einem Verein "Barfuß Trallalla" nur (z.B.) die 3 Spieler angezeigt, die bereits benotet wurden.  
            
          Ich möchte aber alle 20 Spieler des Vereins angezeigt bekommen und bei den 3 bereits benoteten eben auch deren Noten gleich mitgeliefert bekommen.  
            
          Schwierig, nicht??  
            
          Grüße, Q.  
            
          
          
          1. Ich möchte aber alle 20 Spieler des Vereins angezeigt bekommen und bei den 3 bereits benoteten eben auch deren Noten gleich mitgeliefert bekommen.

            Schwierig, nicht??

            Grüße, Q.

            Also ich bekomme hiermit

              
            SELECT *  
            FROM `spieler` S  
            LEFT JOIN `noten` N ON ( S.id = N.spieler_id )  
            
            

            Auch die Spieler angezeigt die keinen Noten zugeordnet sind. Dafür ist das LEFT JOIN ja da.

            Gruß,
            Matty

            1. n'abend,

              Ich möchte aber alle 20 Spieler des Vereins angezeigt bekommen und bei den 3 bereits benoteten eben auch deren Noten gleich mitgeliefert bekommen.

              SELECT *
              FROM spieler S
              LEFT JOIN noten N ON ( S.id = N.spieler_id )

                
              Er möchte zwar alle verfügbaren Daten, allerdings nur von den Spielern eines bestimmten Vereins. Das könnte man mittels einer SubQuery recht einfach lösen:  
                
              ~~~sql
                
              SELECT s.*  
                FROM `spieler` s  
                LEFT JOIN `noten` n  
                  ON ( n.spielerID = s.spielerID )  
               WHERE s.SpielerID IN (  
                   SELECT vz.spielerID  
                   FROM Vereinszugehoerigkeit vz  
                   WHERE  vz.VereinID = 4711  
                   )
              

              weiterhin schönen abend...

              --
              Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
              sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
              1. Er möchte zwar alle verfügbaren Daten, allerdings nur von den Spielern eines bestimmten Vereins. Das könnte man mittels einer SubQuery recht einfach lösen:

                SELECT s.*
                  FROM spieler s
                  LEFT JOIN noten n
                    ON ( n.spielerID = s.spielerID )
                WHERE s.SpielerID IN (
                     SELECT vz.spielerID
                     FROM Vereinszugehoerigkeit vz
                     WHERE  vz.VereinID = 4711
                     )

                
                >   
                > weiterhin schönen abend...  
                  
                Hallo,  
                  
                Du hast mein Problem genau erkannt. Leider tuts aber deine Abfrage auch nicht, ich poste Dir mal den genauen Abfragetext (mit den echten Tabellennamen und deren Präfixen) und dem, was mysql davon hält :-((  
                  
                Grüße, Q.  
                  
                SELECT S.SpielerID, S.SpielerName, VZ.VereinsName, B.BewertungenFach, B.BewertungenLiga\_o\_Laender, B.BewertungenPaarung, B.BewertungenNote, B.BewertungenBemerkung  
                FROM tabelle\_Spieler S, tabelle\_Vereinszugehoerigkeit VZ  
                LEFT JOIN tabelle\_Bewertungen B ON (S.SpielerID = B.SpielerID)  
                WHERE S.SpielerID IN (  
                     SELECT VZ.SpielerID  
                     FROM tabelle\_Vereinszugehoerigkeit VZ  
                     WHERE  VZ.VereinsID = 2 LIMIT 0, 30  
                  
                MySQL meldet:  
                  
                You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT VZ.SpielerID  
                     FROM tabelle\_Vereinszugehoerigkeit VZ  
                
                
                1. n'abend,

                  Du hast mein Problem genau erkannt.

                  auch ein blindes Huhn trinkt gern mal 'nen Korn.

                  SELECT S.SpielerID, S.SpielerName, VZ.VereinsName, B.BewertungenFach, B.BewertungenLiga_o_Laender, B.BewertungenPaarung, B.BewertungenNote, B.BewertungenBemerkung
                  FROM tabelle_Spieler S, tabelle_Vereinszugehoerigkeit VZ

                  Das gibt hier ein Kreuzprodukt; relativ uncool. Versuche mit expliziten JOINs zu arbeiten.
                  Außerdem Joinst du hier eine Tabelle rein, die du in der SubQuery heranziehst. Das ist in diesem Fall unnötig.

                  LEFT JOIN tabelle_Bewertungen B ON (S.SpielerID = B.SpielerID)
                  WHERE S.SpielerID IN (
                       SELECT VZ.SpielerID
                       FROM tabelle_Vereinszugehoerigkeit VZ

                  Hier liegt dein Problem. Du versuchst den Alias "VZ" zwei mal zu benutzen. Das geht natürlich nicht.

                  WHERE  VZ.VereinsID = 2 LIMIT 0, 30

                  Hier fehlt ein »)« am Ende.

                  You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT VZ.SpielerID
                       FROM tabelle_Vereinszugehoerigkeit VZ

                  In der Regel kann man durch diese Hinweise zumindest erahnen wo das Problem liegt. ;)

                  Die obigen Erkenntnisse neu zusammengewürfelt:

                  SELECT  
                        S.SpielerID,  
                        S.SpielerName,  
                        VZ.VereinsName,  
                        B.BewertungenFach,  
                        B.BewertungenLiga_o_Laender,  
                        B.BewertungenPaarung,  
                        B.BewertungenNote,  
                        B.BewertungenBemerkung  
                  FROM tabelle_Spieler S  
                  JOIN tabelle_Vereinszugehoerigkeit VZ  
                    ON ( VZ.SpielerID = S.SpielerID AND VZ.VereinsID = 2 )  
                  LEFT JOIN tabelle_Bewertungen B  
                    ON ( B.SpielerID = S.SpielerID )  
                  LIMIT 0, 30
                  

                  Bemerke, dass wir die WHERE Bedingung »VZ.VereinsID = 2« in die ON Bedingung des Joins gezogen haben. Diese Optimierung bewirkt, dass die Selektion vor dem Join passiert, also weniger Datensätze mit einander verbunden werden müssen.

                  weiterhin schönen abend...

                  --
                  Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
                  sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
                  1. Die obigen Erkenntnisse neu zusammengewürfelt:

                    SELECT

                    S.SpielerID,
                          S.SpielerName,
                          VZ.VereinsName,
                          B.BewertungenFach,
                          B.BewertungenLiga_o_Laender,
                          B.BewertungenPaarung,
                          B.BewertungenNote,
                          B.BewertungenBemerkung
                    FROM tabelle_Spieler S
                    JOIN tabelle_Vereinszugehoerigkeit VZ
                      ON ( VZ.SpielerID = S.SpielerID AND VZ.VereinsID = 2 )
                    LEFT JOIN tabelle_Bewertungen B
                      ON ( B.SpielerID = S.SpielerID )
                    LIMIT 0, 30

                    
                    >   
                    > Bemerke, dass wir die WHERE Bedingung »VZ.VereinsID = 2« in die ON Bedingung des Joins gezogen haben. Diese Optimierung bewirkt, dass die Selektion vor dem Join passiert, also weniger Datensätze mit einander verbunden werden müssen.  
                    >   
                      
                      
                    Wow! Zum ersten Mal macht die Anweisung in etwa das, was ich auch haben will. :-))  
                      
                    2-3 Punkte noch:  
                      
                    1) Könntest Du mir versuchen, mit Worten die select-Anweisung zu umschreiben? Ich raffs leider nicht, würde es aber gerne, damit ich nicht beim nächsten ähnlichen Problem wieder fragen muß.  
                      
                    2) In Deiner Anweisung steht "select VereinsName, was auch gut und schön wäre, leider gibt das nen mysql-fehler, da der Vereinsname nur in der Tabelle "Verein" steht und die VereinsID zusammen mit der SpielerID die Tabelle Vereinszugehoerigkeit bildet.  
                    Kann man die Anweisung noch so umstricken, daß anstelle (oder zusätzlich zur) der VereinsID der VereinsName ausgespuckt wird?  
                      
                    Danke für Deine Hilfe, ich strick an dieser Anweisung nun schon den halben Tag lang herum und komm alleine echt nicht weiter.  
                      
                    Grüße, Q.
                    
                    1. n'abend,

                      1. Könntest Du mir versuchen, mit Worten die select-Anweisung zu umschreiben? Ich raffs leider nicht, würde es aber gerne, damit ich nicht beim nächsten ähnlichen Problem wieder fragen muß.
                      SELECT  
                            S.SpielerID,  
                            S.SpielerName,  
                            VZ.VereinsName,  
                            B.BewertungenFach,  
                            B.BewertungenLiga_o_Laender,  
                            B.BewertungenPaarung,  
                            B.BewertungenNote,  
                            B.BewertungenBemerkung  
                      /* Wir wählen die Felder, die unsere Query zurückliefern soll. Wir geben für jedes Feld den vollen Bezeichner (Tabellenname.Feldname oder Tabellenalias.Feldname ) an, da wir mit multiplen Tabellen hantieren und sicherstellen möchten, dass wir auch das korrekte Feld in der korrekten Tabelle erwischen. Immerhin ist es möglich, dass mehrere Tabellen gleichnamige Felder beinhalten. */  
                      FROM tabelle_Spieler S  
                      /* Wir brauchen eine Basis, von welcher wir unsere Grunddaten (die Spieler, um die es hier ja geht) beziehen können. */  
                      JOIN tabelle_Vereinszugehoerigkeit VZ  
                      /* Die Spieler-Tabelle enthält keine Informationen über Vereinszugehörigkeiten, vermutlich weil ein Spieler in mehreren Vereinen sein kann. Da wir aber nur die Spieler eines bestimmten Vereins betrachten wollen, müüssen wir uns die Vereinszugehörigkeiten verfügbar machen. */  
                        ON ( VZ.SpielerID = S.SpielerID AND VZ.VereinsID = 2 )  
                      /* Ein JOIN ist die Verbindung von Datensätzen aus der einen Tabelle mit Datensätzen aus einer anderen. In der ON-Bedingung eines Joins gibt man an, wie die Datensätze miteinander zu verknüpfen sind. In unserem Fall handelt es sich einfach um die SpielerID, die wir in der Spieler-Tabelle ja vorliegen haben. Da wir aber nicht zu jedem Spieler den Verein brauchen - wir wollen schliesslich nur die Spieler eines einzelnen Vereins betrachten - schränken wir die Menge der Spieler der Vereine ein. Nämlich genau auf die, die dem Verein angehören, den wir betrachten (Verein = 2) */  
                      LEFT JOIN tabelle_Bewertungen B  
                      /* Wir brauchen den LEFT JOIN, weil wir auch die Spieler haben wollen, die noch keine Bewertung kassiert haben */  
                        ON ( B.SpielerID = S.SpielerID )  
                      LIMIT 0, 30
                      

                      Du möchtest dir außerdem die beiden Artikel von Rouven und Vinzenz anschauen: Einführung in Joins und fortgeschrittene Jointechniken. Die beiden erklären dir, wie das mit der JOINerei so von statten geht... ;)

                      1. In Deiner Anweisung steht "select VereinsName, was auch gut und schön wäre, leider gibt das nen mysql-fehler, da der Vereinsname nur in der Tabelle "Verein" steht und die VereinsID zusammen mit der SpielerID die Tabelle Vereinszugehoerigkeit bildet.
                        Kann man die Anweisung noch so umstricken, daß anstelle (oder zusätzlich zur) der VereinsID der VereinsName ausgespuckt wird?

                      Ein JOIN mit der Tabelle, die VereinID nach VereinName auflösen kann, wird deinem Problem Abhilfe schaffen. Allerdings solltest du erst mal selbst versuchen diesen weiteren kleinen JOIN in die obige Query einzubauen. »Man hilft den Menschen nicht, wenn man für sie tut, was sie selbst tun können« (A. Lincoln)

                      weiterhin schönen abend...

                      --
                      Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
                      sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
                      1. n'abend,

                        1. Könntest Du mir versuchen, mit Worten die select-Anweisung zu umschreiben? Ich raffs leider nicht, würde es aber gerne, damit ich nicht beim nächsten ähnlichen Problem wieder fragen muß.

                        SELECT

                        S.SpielerID,
                              S.SpielerName,
                              VZ.VereinsName,
                              B.BewertungenFach,
                              B.BewertungenLiga_o_Laender,
                              B.BewertungenPaarung,
                              B.BewertungenNote,
                              B.BewertungenBemerkung
                        /* Wir wählen die Felder, die unsere Query zurückliefern soll. Wir geben für jedes Feld den vollen Bezeichner (Tabellenname.Feldname oder Tabellenalias.Feldname ) an, da wir mit multiplen Tabellen hantieren und sicherstellen möchten, dass wir auch das korrekte Feld in der korrekten Tabelle erwischen. Immerhin ist es möglich, dass mehrere Tabellen gleichnamige Felder beinhalten. /
                        FROM tabelle_Spieler S
                        /
                        Wir brauchen eine Basis, von welcher wir unsere Grunddaten (die Spieler, um die es hier ja geht) beziehen können. /
                        JOIN tabelle_Vereinszugehoerigkeit VZ
                        /
                        Die Spieler-Tabelle enthält keine Informationen über Vereinszugehörigkeiten, vermutlich weil ein Spieler in mehreren Vereinen sein kann. Da wir aber nur die Spieler eines bestimmten Vereins betrachten wollen, müüssen wir uns die Vereinszugehörigkeiten verfügbar machen. /
                          ON ( VZ.SpielerID = S.SpielerID AND VZ.VereinsID = 2 )
                        /
                        Ein JOIN ist die Verbindung von Datensätzen aus der einen Tabelle mit Datensätzen aus einer anderen. In der ON-Bedingung eines Joins gibt man an, wie die Datensätze miteinander zu verknüpfen sind. In unserem Fall handelt es sich einfach um die SpielerID, die wir in der Spieler-Tabelle ja vorliegen haben. Da wir aber nicht zu jedem Spieler den Verein brauchen - wir wollen schliesslich nur die Spieler eines einzelnen Vereins betrachten - schränken wir die Menge der Spieler der Vereine ein. Nämlich genau auf die, die dem Verein angehören, den wir betrachten (Verein = 2) /
                        LEFT JOIN tabelle_Bewertungen B
                        /
                        Wir brauchen den LEFT JOIN, weil wir auch die Spieler haben wollen, die noch keine Bewertung kassiert haben */
                          ON ( B.SpielerID = S.SpielerID )
                        LIMIT 0, 30

                        
                        >   
                        > Du möchtest dir außerdem die beiden Artikel von Rouven und Vinzenz anschauen: [Einführung in Joins](http://aktuell.de.selfhtml.org/artikel/datenbanken/joins/) und [fortgeschrittene Jointechniken](http://aktuell.de.selfhtml.org/artikel/datenbanken/fortgeschrittene-joins/). Die beiden erklären dir, wie das mit der JOINerei so von statten geht... ;)  
                        >   
                        > > 2) In Deiner Anweisung steht "select VereinsName, was auch gut und schön wäre, leider gibt das nen mysql-fehler, da der Vereinsname nur in der Tabelle "Verein" steht und die VereinsID zusammen mit der SpielerID die Tabelle Vereinszugehoerigkeit bildet.  
                        > > Kann man die Anweisung noch so umstricken, daß anstelle (oder zusätzlich zur) der VereinsID der VereinsName ausgespuckt wird?  
                        >   
                        > Ein JOIN mit der Tabelle, die VereinID nach VereinName auflösen kann, wird deinem Problem Abhilfe schaffen. Allerdings solltest du erst mal selbst versuchen diesen weiteren kleinen JOIN in die obige Query einzubauen. »Man hilft den Menschen nicht, wenn man für sie tut, was sie selbst tun können« (A. Lincoln)  
                        >   
                        > weiterhin schönen abend...  
                          
                          
                        Hallo Globe,  
                          
                        erstmal vielen, vielen Dank für die ausführlichere Erklärung, die hilft mir wirklich weiter und zwar deutlich mehr, als die in den vielen Tutorials :-)  
                          
                        
                        > Ein JOIN mit der Tabelle, die VereinID nach VereinName auflösen kann, wird deinem Problem Abhilfe schaffen.  
                          
                        Jaja, hab ich auch gedacht. Und sollte auch nicht so schwer sein, aaaaaber: Sämtliche Joins, die ich für sinnvoll erachtet habe und analog zu Deinen Joins integriert habe, haben ganz erheblich die Ergebnismenge beeinflußt und das kann ja nun nicht. :-(((  
                        In meiner Testdatenbank wuchs das Ergebnis von 5 auf 25 Datensätze!  
                          
                        SELECT  
                        S.SpielerID,  
                        S.SpielerName,  
                        V.VereinsName,  
                        B.BewertungenFach,  
                        B.BewertungenLiga\_o\_Laender,  
                        B.BewertungenPaarung,  
                        B.BewertungenNote,  
                        B.BewertungenBemerkung  
                        FROM tabelle\_Spieler S  
                        JOIN tabelle\_Vereinszugehoerigkeit VZ  
                        ON ( VZ.SpielerID = S.SpielerID AND VZ.VereinsID = 2 )  
                        LEFT JOIN tabelle\_Bewertungen B  
                        ON ( B.SpielerID = S.SpielerID )  
                        JOIN tabelle\_Verein V  
                        ON ( V.VereinsID = V.VereinsID )  
                        LIMIT 0, 30  
                          
                        Wie kann das? Ich wollt doch lediglich den Namen auflösen.  
                          
                        Die beiden Artikel, die Du verlinkt hast, kenne ich und habe sie schon gelesen. Irgendwie scheiterts immer wieder daran, daß ich denke, es verstanden zu haben, aber die Übung (in Sachen Umsetzung) fehlt. Darf ich Dich mal fragen, wie Du das gelernt hast?  
                          
                        Grüße, Q.
                        
                        1. n'abend,

                          erstmal vielen, vielen Dank für die ausführlichere Erklärung, die hilft mir wirklich weiter und zwar deutlich mehr, als die in den vielen Tutorials :-)

                          vermeide es künftig lange Absätze (am Stück) zu Zitieren, auf die du dich deinem Posting nicht eindeutig beziehst. Man zitiert, um sich auf eine bestimmte Stelle zu beziehen, nicht um den gesamten Inhalt des Postings, auf das man gerade Antwortet, erneut in die Datenbank zu jucken.

                          Ein JOIN mit der Tabelle, die VereinID nach VereinName auflösen kann, wird deinem Problem Abhilfe schaffen.

                          Jaja, hab ich auch gedacht. Und sollte auch nicht so schwer sein, aaaaaber: Sämtliche Joins, die ich für sinnvoll erachtet habe und analog zu Deinen Joins integriert habe, haben ganz erheblich die Ergebnismenge beeinflußt und das kann ja nun nicht. :-(((

                          Das kann durchaus sein. Nämlich genau dann, wenn es in der reingeJOINten Tabelle zu einem Datensatz mehrere passende Datensätze gibt.

                          In meiner Testdatenbank wuchs das Ergebnis von 5 auf 25 Datensätze!

                          5 * 5 = 25. Du hast also zu jedem Datensatz 5 weitere Datensätze? Oder baust du da (ungewollt) ein Kreuzprodukt?

                          SELECT
                          S.SpielerID,
                          S.SpielerName,
                          V.VereinsName,
                          B.BewertungenFach,
                          B.BewertungenLiga_o_Laender,
                          B.BewertungenPaarung,
                          B.BewertungenNote,
                          B.BewertungenBemerkung
                          FROM tabelle_Spieler S
                          JOIN tabelle_Vereinszugehoerigkeit VZ
                          ON ( VZ.SpielerID = S.SpielerID AND VZ.VereinsID = 2 )
                          LEFT JOIN tabelle_Bewertungen B
                          ON ( B.SpielerID = S.SpielerID )
                          JOIN tabelle_Verein V
                          ON ( V.VereinsID = V.VereinsID )

                          Hier haben wir den Fehler doch schon. Achte auf die ON-Bedingung. Du willst da vermutlich »V.VereinsID = VZ.VereinsID« machen?

                          Ich würde außerdem die Reihenfolge der JOINs ändern:

                          SELECT  
                             S.SpielerID,  
                             S.SpielerName,  
                             V.VereinsName,  
                             B.BewertungenFach,  
                             B.BewertungenLiga_o_Laender,  
                             B.BewertungenPaarung,  
                             B.BewertungenNote,  
                             B.BewertungenBemerkung  
                          FROM tabelle_Spieler S  
                          JOIN tabelle_Vereinszugehoerigkeit VZ  
                            ON ( VZ.SpielerID = S.SpielerID AND VZ.VereinsID = 2 )  
                          JOIN tabelle_Verein V  
                            ON ( V.VereinsID = VZ.VereinsID )  
                          LEFT JOIN tabelle_Bewertungen B  
                            ON ( B.SpielerID = S.SpielerID )
                          

                          Die beiden Artikel, die Du verlinkt hast, kenne ich und habe sie schon gelesen. Irgendwie scheiterts immer wieder daran, daß ich denke, es verstanden zu haben, aber die Übung (in Sachen Umsetzung) fehlt. Darf ich Dich mal fragen, wie Du das gelernt hast?

                          1. Probieren, probieren, probieren (ich bin einer dieser Trial-and-Error Leute.)
                          2. Nachfragen, wenn gar keine Lösung in Sicht war (sehr zur Belustigung der Antwortenden, wie ich meine)
                          3. Frau D.K. aus D. mit meiner Fragerei zur Weißglut gebracht >:)
                          4. Die von D.K. aus D. empfohlenen Bücher zur Optimierung von SQL Queries gelesen (gut, zu dem Zeitpunkt hatte ich JOIN-Techniken bereits intus)
                          5. Man glaubt es kaum, doch auch im Studium lernt man das eine oder andere ;)

                          weiterhin schönen abend...

                          --
                          #selfhtml hat ein Forum?
                          sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
                          1. Hier haben wir den Fehler doch schon. Achte auf die ON-Bedingung. Du willst da vermutlich »V.VereinsID = VZ.VereinsID« machen?

                            Oops. Stimmte genau :-)

                            Ich würde außerdem die Reihenfolge der JOINs ändern:
                            Darf ich Dich mal fragen, wie Du das gelernt hast?

                            1. Probieren, probieren, probieren (ich bin einer dieser Trial-and-Error Leute.)
                            2. Nachfragen, wenn gar keine Lösung in Sicht war (sehr zur Belustigung der Antwortenden, wie ich meine)
                            3. Frau D.K. aus D. mit meiner Fragerei zur Weißglut gebracht >:)
                            4. Die von D.K. aus D. empfohlenen Bücher zur Optimierung von SQL Queries gelesen (gut, zu dem Zeitpunkt hatte ich JOIN-Techniken bereits intus)
                            5. Man glaubt es kaum, doch auch im Studium lernt man das eine oder andere ;)

                            Jep. Ich probiere und probiere auch oft tage- und nächtelang. Irgendwann aber gehts einfach nicht mehr weiter oder ich benötige neuen Input oder neue Ideen. Oft lerne ich dann Begriffe, Methoden, befehle kennen, die ich zuvor noch gar nicht kannte.

                            Was Frau K. angeht, Du scheinst ein würdiger Nachfolger zu sein ;-))

                            Grüße, Q.

                            1. n'abend,

                              Jep. Ich probiere und probiere auch oft tage- und nächtelang. Irgendwann aber gehts einfach nicht mehr weiter oder ich benötige neuen Input oder neue Ideen. Oft lerne ich dann Begriffe, Methoden, befehle kennen, die ich zuvor noch gar nicht kannte.

                              Mir geht das auch heute noch (eigentlich heute mehr denn je) nicht anders. Man lernt halt nie aus...

                              Was Frau K. angeht, Du scheinst ein würdiger Nachfolger zu sein ;-))

                              Hehe, danke.

                              weiterhin schönen abend...

                              --
                              #selfhtml hat ein Forum?
                              sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
                              1. Mir geht das auch heute noch (eigentlich heute mehr denn je) nicht anders. Man lernt halt nie aus...

                                Du? Heute noch? *grmpf* Mußt Du mich jetzt hier so desillusionieren? ;-)))

                                Was Frau K. angeht, Du scheinst ein würdiger Nachfolger zu sein ;-))

                                Hehe, danke.

                                Ernst gemeint und gern geschehen. 'Weißt vermutlich selber, wie das ist, wenn jemand (Frau K., Herr Globe *grins*) einem auf dem Stand seiner Kentnisse (egal, wo das gerade ist) an die Hand nimmt und ein paar Schritte mit ihm durch die Programmierwelt spaziert ;-)

                                Ok, genug der lyrischen Ansätze. Finds klasse, daß es Typen, wie Frau K. und Herrn Globe gibt. Herzlichen Dank (in diesem Fall) an Dich!

                                Q.

                                weiterhin schönen abend...

                                1. n'abend,

                                  Du? Heute noch? *grmpf* Mußt Du mich jetzt hier so desillusionieren? ;-)))

                                  je mehr du lernst, desto stärker das Gefühl, dass du eigentlich keine Ahnung hast. Mit der Zeit lernst du einfach zu viele Dinge, die du nicht mehr im Detail beherrschen kannst (oder willst).

                                  Ernst gemeint und gern geschehen. 'Weißt vermutlich selber, wie das ist, wenn jemand (Frau K., Herr Globe *grins*) einem auf dem Stand seiner Kentnisse (egal, wo das gerade ist) an die Hand nimmt und ein paar Schritte mit ihm durch die Programmierwelt spaziert ;-)

                                  ich muss zugeben, dass meistens nur die Fragen beantworte (oder es versuche), die auf der Hand liegen (super, dazu braucht's mich hier nicht), oder bei denen ich auf Anhieb keine Antwort geben kann, mich das Thema aber so interessiert, dass ich auf Forschungsreisen gehe. Dein Fall war so ein bisschen Forschungsreise, weil die netten SQL-Dinge in MySQL recht neu sind und ich bislang wenig mit ihnen (unter MySQl) zu tun hatte... Du merkst, nicht alles ist Gold was glänzt :)

                                  weiterhin schönen abend...

                                  --
                                  #selfhtml hat ein Forum?
                                  sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|
            2. Also ich bekomme hiermit

              SELECT *
              FROM spieler S
              LEFT JOIN noten N ON ( S.id = N.spieler_id )

              
              >   
              > Auch die Spieler angezeigt die keinen Noten zugeordnet sind. Dafür ist das `LEFT JOIN`{:.language-sql} ja da.  
                
                
              Hi Matty,  
                
              und wie filterst Du das ganze dann nach Spiel?  
                
              Also Spieler mit ID 5 hat z.B. 100 Noten, davon genau 1 für Spielpaarung xyz.  
                
              Weitere 10 Spieler haben auch schon ihre Note für die Spielpaarung xyz bekommen. Es fehlen weitere 9 Bewertungen. Die Spalte "Spielpaarung" ist nur in der Notentabelle existent.  
                
              Jetzt bin ich gespannt, weil genau DAS bekomme ich nicht hin :-(  
                
              Grüße, Q.