Markus: JOIN

Hallo...
ich möchte aus aus einer Datenmenge ermitteln welcher Eintrag von Nutzer X noch nicht ausgewählt wurde. Dafür hab ich eine 2 Tabelle erstellt, in der gespeichert wird welcher Eintrag aus Tabelle 1 schon vom Benutzer gewählt wurde.
Aber.. wo ist mein Fehler?

tabelle1

+--------+--------+-------+
|id      |name    |count  |
+--------+--------+-------+
|1       |Hans    |0      |
|2       |Bert    |12     |
|3       |Fritz   |4      |
|4       |Karl    |3      |

tabelle2

+--------+--------+
|id      |v_id    |
+--------+--------+
|1       |V1      |
|1       |V2      |
|3       |V1      |
|4       |V1      |

SELECT
 id, name, count
FROM
 tabelle1
LEFT JOIN
 tabelle2
ON
 tabelle1.id = tabelle2.id AND tabelle2.v_id != 'V1'
GROUP BY
 tabelle1.id
LIMIT 0,1

dieses query erzielt nicht das von mir gewünschte Ergebnis :-/

Ich hoffe ich hab mich einigermaßen verständlich ausgedrückt, wenn nicht - bitte nachfragen!

  1. Hallo,

    du möchstest alle Datensätze aus Tabelle1, deren Id nicht in Tabelle2 auftaucht? Wenn ich dich da falsch verstehe, erkläre dich bitte besser. Z.b. die Rolle von "Eintrag" is schwammig. Oder schreibe einfach, was du gern als Ergebnis gehabt hättest.

    Wenn meine Annahme stimmt, dann ...

    Variante 1) Du kannst dann logischerweise nur mit dem Feld den Join machen, der beide Tabellen verbindet, also "id". Ein LEFT JOIN ergibt folgende Menge

    +--------+--------+-------+--------+--------+
    |id      |name    |count  |id      |v_id    |
    +--------+--------+-------+--------+--------+
    |1       |Hans    |0      |1       |V1      |
    |1       |Hans    |0      |1       |V2      |
    |2       |Bert    |12     |NULL    |NULL    |
    |3       |Fritz   |4      |3       |V1      |
    |4       |Karl    |3      |4       |V1      |

    Mit der zusätzlichen Einschränkung tabelle2.id IS NULL bleibt von der Gesamtmenge nur noch Id 2 (Bert) übrig.

    Passendes SQL:

      
    SELECT  
     id, name, count  
    FROM  
     tabelle1  
    LEFT JOIN  
     tabelle2  
    ON  
     tabelle1.id = tabelle2.id  
    WHERE tabelle2.id IS NULL  
    GROUP BY  
     tabelle1.id, tabelle1.name, tabelle1.count  
    LIMIT 0,1  
    
    

    Variante 2) wahrschweinlich einfacher

    Verbal: Gib mir alle Ids aus Tabelle die nicht in Tabelle2 auftauchen.

    Vorausgesetzt dein Datenbanksystem (ich tippe auf mySQL wegen der verhunzten Verwendung von GROUP BY) unterstützt "subqueries"/Unterabfragen ...

      
    SELECT  
     id, name, count  
    FROM  
     tabelle1  
    WHERE tabelle1.id NOT IN             -- IN ist ein Operator  
          (SELECT  
             DISTINCT id  
           FROM  
             tabelle2)  
    
    

    HTH, Ciao, Frank

    1. Ja, stimmt alles!

      Das IS NULL war ein guter Tip! Danke!
      Habe das query nun angepasst und es bringt das gewünschte Resultat!

      Schönen Dank!