Skywalkerluk: LEFT JOIN - Ist das mein richtiger Ansatz?

Hallo zusammen,

ich steh vor folgendem Problem:

Tabelle LIGA:
spielID - ergebnis
1 - 2:1
2 - 1:1
3 - 3:1
4 - 4:1
5 - 2:2
6 - 1:3
7 - 5:1
8 - 2:1

Tabelle TIPP:
User_ID - spielID - tipp
503 - 1 - 2:2
503 - 2 - 1:1
503 - 3 - 1:3
//Den vierten Datensatz gibt es nicht weil der User nich getippt hat.
503 - 5 - 2:3
503 - 6 - 1:3
503 - 7 - 5:2
503 - 8 - 2:4

Folgende Ausgabe hätte ich gerne:
User_ID - spielID -ergebnis - tipp
503 - 1 - 2:1 - 2:2
503 - 2 - 1:1 - 1:1
503 - 3 - 3:1 - 1:3
503 - 4 - 4:1 - NULL
503 - 5 - 2:2 - 2:3
503 - 6 - 1:3 - 1:3
503 - 7 - 5:1 - 5:2
503 - 8 - 2:1 - 2:4

Mein Versuch:
SELECT a.spiel_id, a.ergebnis, b.tipp
FROM LIGA as a
LEFT JOIN TIPP as b
ON a.spiel_id = b.spiel_id
WHERE b.User_ID = 503;

Leider zeigt der mir hier aber nur 7 Datensätze anstatt der gewünschten 8.
Ich möchte also dass die spiel_id von LIGA immer angezeit wird, auch wenn der user nicht getippt hat.

Wo ist mein Denkfehler?

Vielen Dank vorab für eure Hilfe.

  1. Lieber Skywalkerluk,

    Dein Ansatz ist im Prinzip völlig richtig - wäre da nicht die Sache mit den "fehlenden" Datensätzen. Da Du auch selektieren willst, wenn es einen Datensatz nicht gibt, ist ein Join für Deinen speziellen Fall wenig sinnvoll, da er genau diese fehlenden Datensätze berücksichtigt, und dann eben nicht selektiert.

    Versuche es doch mit einem Sub-Select!

    SELECT  
        LIGA.spiel_id AS spiel_id,  
        LIGA.ergebnis AS ergebnis,  
        (  
            SELECT  
                TIPP.tipp  
            FROM TIPP  
            WHERE  
                TIPP.User_ID = 503  
                AND spiel_id = LIGA.spiel_id  
        ) AS tipp  
    FROM LIGA;
    

    Ich habe das nicht geprüft, von daher kann mein Code scheitern, aber Du siehst sicher, was ich meine.

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Lieber Felix,

      vielen Dank für die Antwort und den Hinweis.
      1. Es funktioniert wie du es beschrieben hast.
      aber leider
      2. Es dauert super lange bis der Befehl ausgeführt wird. Ich benötige noch einige weitere Daten aus der BD, sodass der Aufruf bei einem User ca. 3-4 Sekunden dauert. Ich habe teilweise 30 User in einer Gruppe.

      Da stehe ich nun mit meinem Unglück/Unwissen.

      Lukas

      1. Lieber Skywalkerluk,

        vielen Dank für die Antwort und den Hinweis.

        1. Es funktioniert wie du es beschrieben hast.

        ausgezeichnet! Das freut mich für uns beide. ;-)

        aber leider
        2. Es dauert super lange

        Das hat wahrscheinlich damit zu tun, dass die Felder spiel\_id und user\_id keine Indices sind. Wenn Du sie in beiden(! wenn nicht gar allen betroffenen) Tabellen zu Indices (wenn nicht sogar zu Primärschlüsseln) machst, dann sollte die Abfrage deutlich schneller sein.

        Wenn ich unsere Code-Beispiele vergleiche, dann fällt mir auf, dass "spiel_id" auch "SpielID" lautet, ebenso wie "user_id" und "UserID"... aber das hast Du sicherlich längst für Dich gelöst.

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. Felix, du bist echt mein Held!!!

          Das war der entscheidende Tipp:

          Das hat wahrscheinlich damit zu tun, dass die Felder spiel\_id und user\_id keine Indices sind. Wenn Du sie in beiden(! wenn nicht gar allen betroffenen) Tabellen zu Indices (wenn nicht sogar zu Primärschlüsseln) machst, dann sollte die Abfrage deutlich schneller sein.

          Jetzt benötigt der Aufruf wenige MS, das ist super!
          Ich danke dir!!!

          LG Lukas